关于P1010的求助
  • 板块学术版
  • 楼主Kirov
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/24 16:18
  • 上次更新2023/11/24 19:14:43
查看原帖
关于P1010的求助
517343
Kirov楼主2023/11/24 16:18

打表失败


事情是这样的,

我懒得用dfs (其实是做错了) 然后想到题目给出的范围是n≤2×104<215n \le 2 \times 10^4<2^{15} 也就是说总共能分出的结果只有0-15,可以考虑打表求出对应的分解情况。

于是乎,我就这么做了() 然后出现了非常诡异的情况,评测结果一会RE一会TLE而且每次出现的点的位置还不同次数也不一样……

望dalao帮助


附上代码

#include<bits/stdc++.h>
using namespace std;
int a[1005];
string ans;
int main()
{
	int n;
	cin>>n;
	int e=1;
	while(n>0)
	{
		a[e++]=n%2;
		n/=2;
	}
	int i;
	while(pow(2,i)<=n)
	{
		i++;
	}
	//cout<<i<<endl;
	for(int j=i;j>=1;j--)
	{
		string s;
		if(a[j])
		{
			switch(j-1)
		{
			case 0:s="2(0)";break;
			case 1:s="2";break;
			case 2:s="2(2)";break;
			case 3:s="2(2+2(0))";break;
			case 4:s="2(2(2))";break;
			case 5:s="2(2(2)+2(0))";break;
			case 6:s="2(2(2)+2)";break;
			case 7:s="2(2(2)+2+2(0))";break;
			case 8:s="2(2(2+2(0)))";break;
			case 9:s="2(2(2+2(0))+2(0))";break;
			case 10:s="2(2(2+2(0))+2)";break;
			case 11:s="2(2(2+2(0))+2+2(0))";break;
			case 12:s="2(2(2+2(0))+2(2))";break;
			case 13:s="2(2(2+2(0))+2(2)+2(0)";break;
			case 14:s="2(2(2+2(0))+2(2)+2)";break;
			case 15:s="2(2(2+2(0))+2(2)+2+2(0))";break;
		}
		ans=ans+s+"+";
		}
		
		
	}
	if(ans[ans.length()-1]=='+') ans[ans.length()-1]='\0';
	cout<<ans;//<<" "<<ans[ans.length()-1];
	return 0;
}
2023/11/24 16:18
加载中...