http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3768
打表暴力撸 答案最多只可能是三个数
#include <iostream>
#include <cstdio>
#include <map>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
map<int, int>memo;
int pls[20000];
int main()
{
// freopen("data.in","r", stdin);
int n, x, cnt = 0, ok;
for(int sum = 0; sum <= 123456789;)
{
cnt++;
sum += cnt;
pls[cnt] = sum;
memo[sum] = cnt;
}
scanf("%d", &n);
while(n--)
{
scanf("%d", &x);
if(memo[x]) {//1
printf("%d\n", memo[x]);
}else
{
ok = 0;
for(int i = 1; i <= cnt; i++)//2
{
if(memo[x-pls[i]])
{
printf("%d %d\n", i, memo[x-pls[i]]);
ok = 1;
break;
}
}
if(!ok)
{
for(int i = 1; i <= cnt && !ok; i++)//3
{
for(int j = 1; j <= cnt && !ok; j++)
{
if(memo[x-pls[i]-pls[j]])
{
printf("%d %d %d\n", i, j, memo[x-pls[i]-pls[j]]);
ok = 1;
break;
}
}
}
}
}
}
return 0;
}