cf_1293_AB

对于A题,因为它的k是有限的,就没必要去管n的范围,只要在[n-1500,n+1500]加入k然后循环一遍就行,当然1500是随便的,想2000也行。

一下为代码:

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int vis[3000]={0};
int main(){
    int t;
    cin>>t;
    while(t--){
        memset(vis,0,sizeof vis);
        int n,s,k;
        cin>>n>>s>>k;int i,j;
        for(i=0;i<k;i++){
            cin>>j;
            if(abs(s-j)<3000)
            vis[abs(s-j)]++;
        }
        if(vis[0]==0){
            cout<<0<<endl;
            continue;
        }
        for(int i=1;i<3000;i++){
                if(s-i>0&&i+s<=n){
                    if(vis[i]!=2){
                cout<<i<<endl;
                break;
                    }
                }else{
                    if(vis[i]!=1){
                        cout<<i<<endl;
                        break;
                    }
                }
 
        }
    }
    return 0;
}
A

而对于B题,只要发现一个规律,即每次减少一人,赚的钱总是最多即可:

#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int main(){
    int n;
    cin>>n;
    double sum=0;
    for(int i=n;i>0;i--){
        sum+=1.0/i;
    }
    printf("%.12f\n",sum);
    return 0;
}
B
posted @ 2020-01-20 09:50  Ean1zhi  阅读(133)  评论(0)    收藏  举报