週一訓練賽題解

此次徹底是水題大集合啊,但願你們A的開心;ide

前兩個題是我找的,後兩個是陶叔找的,另外由於個人偷懶,下面全部的代碼都是陶叔親自寫的,十分感謝陶叔;spa

陶叔暑假爲了你們的集訓,犧牲了不少本身寶貴的時間,你們接下來要好好訓練啊!!!!code

廢話少說,進入正題:blog

 

Problem A      SPOJ QUEST5數學

簽到題:string

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

代碼:io

#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 FAVDICEevent

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

從已經出現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
相關文章
相關標籤/搜索