这是朴素代码,t飞了:
#include<bits/stdc++.h>
using namespace std;
int w,inf;
int n,x;
int main(){
scanf("%d%d",&x,&n);n++;
while(x){
x/=2;w++;
if(x == 1) break;
}x = w;
if(x>=n){
puts("0");return 0;
}
// printf("nowwei:%d aimwei:%d\n",x,n);
while(x<n){
x = x*2-1;inf++;
// printf("nowwei:%d aimwei:%d\n",x,n);
}printf("%d",inf);
return 0;
}
思路:将数字转为二进制,观察到每次操作会使其位数 ×2−1,而目标是2n,当前攻击力与目标位数相同的情况下必定是大于目标的(1000000...),因此暴力枚举操作次数即可暴力枚举の提交记录
发现t飞了之后想到用二分优化,但是怎么调都是wa 0pts。code:
#include<bits/stdc++.h>
using namespace std;
int w,inf;
int n,x;
inline int qpow(int q,int p){
int ans = 1;
for(;p;p>>=1){
if(p&1) ans = ans*q;
q *= q;
}
return ans;
}
inline bool jg(int a){
return (qpow(2,a)*x-qpow(2,a-1)>=n)?1:0;
}
int main(){
scanf("%d%d",&x,&n);n++;
while(x){
x/=2;w++;
//if(x == 1) break;
}x = w;//printf("%d %d\n",x,n);
if(x>=n){
puts("0");return 0;
}
if(x*2>=n){
puts("1");return 0;
}
int l = 1,r = 30;
while(l < r){
int mid = (l+r+1)>>1;
if(jg(mid)) r = mid-1;
else l = mid+1;
// printf("%d %d %d\n",l,r,mid);
}
printf("%d",r);
return 0;
}
/*
2x+1
4x+3
8x+7
*/
求dalao调/hack