比赛的时候想要是区间个数多了,2个小的可以合并成1个大的,所以按个数从少到多枚举,判断是否有解,觉得可行,可是num数组少开了1个0啊,大的数据就跑不出来了,以为自己想错了,直接放弃了,dfs不用剪枝都能过啊
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<map>
#define N 16000
using namespace std;
int num[N+5];
map<int,int> m;
int ans[N];
void init(){
int i,tmp=0;
for(i=1;i<=N;i++){
tmp+=i;
num[i]=tmp;
m[tmp]=i;
}
}
bool dfs(int now,int cnt,int s,int sum){
int i;
if(now==cnt-1){
if(m.find(sum)!=m.end()){
ans[now]=m[sum];
return true;
}
return false;
}
for(i=s;num[i]*2<=sum;i++){
ans[now]=i;
if(dfs(now+1,cnt,i,sum-num[i]))
return true;
}
return false;
}
int main()
{
int t,n,i,j,L,R,M;
init();
scanf("%d",&t);
while(t--){
scanf("%d",&n);
L=1;R=n;
for(i=1;i<=n;i++){
if(dfs(0,i,1,n))
break;
}
for(j=0;j<i-1;j++){
printf("%d ",ans[j]);
}
printf("%d\n",ans[i-1]);
}
return 0;
}