题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5231
题意:给定一个正整数
,其中
,把
用最少的三角形数之和来表示,输出它们。
分析:有一个定理每一个正整数可以表示为3个三角形数之和,所以这样我们可以先判断
是否是一个三角形数,如
果是,则直接输出,否则判断是否是两个三角形数之和,如果是,则输出,否则一定就是三个三角形数之和。
在找这些数的时候可以利用二分来求解,这样时间复杂度会比较低。
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <map>
using namespace std;
const int N = 100005;
int sum[N];
map<int,int> mp;
int cnt,n;
void Init()
{
mp.clear();
cnt = 1;
mp[1] = 1;
sum[1] = 1;
while(1)
{
if(sum[cnt] > 123456789) break;
cnt++;
sum[cnt] = sum[cnt-1] + cnt;
mp[sum[cnt]] = cnt;
}
}
bool OK(int x)
{
int l = 1;
int r = upper_bound(sum,sum+cnt,x) - sum - 1;
while(l <= r)
{
if(sum[l] + sum[r] < x)
l++;
else if(sum[l] + sum[r] > x)
r--;
else
{
printf("%d %d",l,r);
return true;
}
}
return false;
}
int main()
{
Init();
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
if(mp.count(n))
{
printf("%d\n",mp[n]);
continue;
}
if(OK(n))
{
puts("");
continue;
}
int up = upper_bound(sum,sum+cnt,n) - sum - 1;
for(int i=1;i<=up;i++)
{
if(OK(n-sum[i]))
{
printf(" %d\n",i);
break;
}
}
}
return 0;
}
标签:表示,cnt,正整数,int,sum,mp,三角形,include From: https://blog.51cto.com/u_16146153/6386940