浙大赛之前刷套题练练手。因为不想用太多flag,就直接写了goto,简单粗暴,不过以前C语言课告诫我们少用goto来着。
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdio>
using namespace std;
int a[16000]={0};
void init() {
for (int i=1;i<=15713;i++)
a[i]=a[i-1]+i;
}
int main()
{
init();
int t,n,pos,pos1,pos2;
scanf("%d",&t);
tag:
while (t--) {
scanf("%d",&n);
pos=upper_bound(a,a+15713,n)-a-1;
if (n==a[pos]) {
printf("%d\n",pos);
goto tag;
}
else {
for (int i=pos;i>=1;i--) {
pos1=upper_bound(a,a+15713,n-a[i])-a-1;
if (n==a[i]+a[pos1]) {
printf("%d %d\n",i,pos1);
goto tag;
}
}
for (int i=pos;i>=1;i--) {
pos1=upper_bound(a,a+15713,n-a[i])-a-1;
for (int j=pos1;j>=1;j--) {
pos2=upper_bound(a,a+15713,n-a[i]-a[j])-a-1;
if (n==a[i]+a[j]+a[pos2]) {
printf("%d %d %d\n",i,j,pos2);
goto tag;
}
}
}
}
}
return 0;
}