对于A题,因为它的k是有限的,就没必要去管n的范围,只要在[n-1500,n+1500]加入k然后循环一遍就行,当然1500是随便的,想2000也行。
一下为代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
而对于B题,只要发现一个规律,即每次减少一人,赚的钱总是最多即可:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }