The Next
3 11 2 4 22 3 3 15 2 5
Case #1: 12 Case #2: 25 Case #3: 17
#include<iostream> #include<cstdio> using namespace std; int main(){ int T,kase=1; scanf("%d",&T); while(T--){ long long D,s1,s2,cnt; scanf("%lld%lld%lld",&D,&s1,&s2); for(long long i=D+1;;i++){ long long n=i,f[100]={0},t=0; cnt=0; while(n){ f[t++]=n%2; n/=2; if(f[t-1]==1) cnt++; } if(cnt>=s1&&cnt<=s2){//符合题意 printf("Case #%d: %lld\n",kase++,i); break; } else if(cnt<s1){//可以变 t=0; while(cnt<s1){ if(f[t]==0){ cnt++; f[t]=1; } t++; } long long sum=0,x=1; for(int j=0;j<100;j++){ sum+=(f[j]*x); x*=2; } printf("Case #%d: %lld\n",kase++,sum); break; } } } return 0; }然后是爆搜程序,可以拿去对拍:
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> using namespace std; int main(){ int T,kase=1; scanf("%d",&T); while(T--){ int D,s1,s2; scanf("%d%d%d",&D,&s1,&s2); for(int i=D+1;;i++){ int n=i,cnt=0; while(n){ if(n%2==1) cnt++; n/=2; } if(cnt>=s1&&cnt<=s2){ printf("Case #%d: %d\n",kase++,i); break; } } } return 0; }