周一訓練賽題解

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   for   art   

這次完全是水題大集合啊,希望大家A的開心;

前兩個題是我找的,後兩個是陶叔找的,另外因為我的偷懶,下面所有的代碼都是陶叔親自寫的,十分感謝陶叔;

陶叔暑假為了大家的集訓,犧牲了很多自己寶貴的時間,大家接下來要好好訓練啊!!!!

廢話少說,進入正題:

 

Problem A      SPOJ QUEST5

簽到題:

將所有的邊按照右端點排個序,然後每次選擇沒有釘住的點,然後把這之後的所有與它相交的邊全去掉;

代碼:

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 10100;struct Table{    int l,r;    bool operator < (const Table &rhs) const{        return r < rhs.r;    }}table[maxn];int main(){    int kase,n;    scanf("%d",&kase);    while(kase--){        scanf("%d",&n);        for(int i = 0;i < n;i++){            scanf("%d%d",&table[i].l,&table[i].r);        }        sort(table,table+n);        int ans = 0,r = -1;        for(int i = 0;i < n;i++){            if(r < table[i].l){                ans++;                r = table[i].r;            }        }        printf("%d\n",ans);    }    return 0;}
View Code

 

Problem B      SPOJ FAVDICE

數學題,也是給大家YY的題,不會只能怪高中老師了~~~

從已經出現i面變成已經出現i+1面的期望投擲次數是N/(N-i)。

代碼:

#include <cstdio>int main(){    int kase,n;    scanf("%d",&kase);    while(kase--){        scanf("%d",&n);        double ans = 0;        for(int i = 1;i <= n;i++)   ans += (n+0.0)/(i+0.0);        printf("%.2f\n",ans);    }    return 0;}
View Code

 

Problem C      SPOJ GNYR09F

dp題,dp可能剛剛開始對大家來說比較難,但是靜下心來分析還是比較簡單的;

dp(i ,j ,k)表示前i個數中,當前累積和為j,末尾數字為k的方案數。

考慮第i個位置的2種情況:

  1.放0:dp(i,j,0) = dp(i-1,j,0) + dp(i-1,j,1)

  2.放1:dp(i,j,1) = dp(i-1,j,0)

  如果還有j>=1,dp(i,j,1) += dp(i-1,j-1,1)

#include <cstdio>#include <cstring>int dp[101][101][2];int main(){    int kase,hehe,n,k;    scanf("%d",&kase);    while(kase--){        scanf("%d%d%d",&hehe,&n,&k);        for(int i = 0;i <= k;i++)   dp[1][i][0] = dp[1][i][1] = 0;        dp[1][0][0] = dp[1][0][1] = 1;        for(int i = 2;i <= n;i++){            for(int j = 0;j <= k;j++){                dp[i][j][0] = dp[i-1][j][0]+dp[i-1][j][1];                dp[i][j][1] = dp[i-1][j][0];                if(k >= 1)  dp[i][j][1] += dp[i-1][j-1][1];            }        }        printf("%d %d\n",hehe,dp[n][k][0]+dp[n][k][1]);    }    return 0;}
View Code

 

Problem D      SPOJ VENOM

二分題,如果有人把它當做暴力題來做,而且執迷不悟,那麼歡迎前來和聰哥組隊去跑馬拉鬆了~~~

直接二分英雄死亡的時間,然後計算判斷即可~~~

代碼:

#include <cstdio>typedef long long LL;int H,P,A;bool judge(int n){    LL ans = (LL)(n+1)*n/2*P-(LL)(n-1)*A-H;    if(ans >= 0) return 1;    return 0;}int main(){    int kase;    scanf("%d",&kase);    while(kase--){        scanf("%d%d%d",&H,&P,&A);        int l = 1,r = 1000000,ans = l;        while(l <= r){            int mid = (l+r)>>1;            if(judge(mid))  r = mid-1,ans = mid;            else    l = mid+1;        }        printf("%d\n",ans*2-1);    }    return 0;}
View Code

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.