一种基于位运算的思路,求调
查看原帖
一种基于位运算的思路,求调
399244
编程小贝壳楼主2024/4/9 21:52

这是朴素代码,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\times2-1,而目标是2n2^n,当前攻击力与目标位数相同的情况下必定是大于目标的(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

2024/4/9 21:52
加载中...