求助,不知道是思路错误还是代码错误
查看原帖
求助,不知道是思路错误还是代码错误
119643
潜水的蒟蒻楼主2022/10/7 09:29

思路: 根据题意对于长度为n的数列不断二分,记录上一次二分的时候k在前一半还是后一半。如果是上一次在前一半且这一次在后一半或者前一次在后一半且这一次在前一半则对答案字符串+1,否则+0。通过不断的二分下去从前往后加出答案字符串。 代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
string ans;
bool ri;
signed main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	unsigned int n,k;cin>>n>>k;
	k++;//换成下下标从1开始
	unsigned int l=1,r=2<<n-1;
	if(n==1)
	{
		cout<<k-1;
		cout<<"test1";
		return 0;
	}
	else
	{
		unsigned int mid=(l+r)/2;
		if(k>mid)
		{
			ans="1";
			ri=1;
			l=mid+1;
		}
		else
		{
			ans="0";
			r=mid;
		}
	}
	cout<<"test :ans="<<ans<<" l="<<l<<" r="<<r<<endl;
	while(l<=k&&k<=r)
	{
		if(l+1==r)
		{
			if((k==l&&ri)||(k==r&&!ri))ans+='1';
			else ans+='0';
			break;
		}
		unsigned int mid=(l+r)/2;
		if((k>mid&&ri)||(k<=mid&&!ri))
		{
			ans+='0';
			l=mid+1;
		}
		else
		{
			ans+='1';
			r=mid;
		}
		cout<<"test :ans="<<ans<<endl;
	}
	cout<<ans;
 	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

现在只能过样例1,样例2输出110,样例3第一个调试输出l=2049,r=4096然后答案输出1

2022/10/7 09:29
加载中...