题目连接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5231
题目意思:
给一个整数n,求最少m个三角形数,输出每个三角形数的位数。
题目想法:
数学定理,任何自然数最多由用m个m边行数组成。
暴力求解。
技巧处理,数组保存的是三角形数。
注意二分查找。
题目代码:
#include<iostream>
#include<cstdio>
#define MAX 15713+1
using namespace std;
int a[MAX];
int t;
//int find(int n)
//{
// int l=1;
// while(l<MAX)
// {
// if(n==a[l])
// return l;
// l++;
// }
// return 0;
//}
int find(int n)
{
int l=0,r=MAX-1;//均闭
while(l<=r)
{
int mid=(l+r)/2;
if(a[mid]==n)return mid;
if(n<a[mid])r=mid-1;
else l=mid+1;
}
return r;
}
int main()
{
a[0]=0;
for(int i=1;i<MAX;i++)
a[i]=a[i-1]+i;
scanf("%d",&t);
while(t--)
{
int n,i,j;
scanf("%d",&n);
bool flat=false;
int pos=find(n);
if(a[pos]==n){printf("%d\n",pos);continue;}
int l=1;
int r=MAX-1;
while(l<=r)
{
if(a[l]+a[r]==n){flat=true;break;}
if(n<a[l]+a[r])r--;
else l++;
}
if(flat){printf("%d %d\n",l,r);continue;}
for(i=1;i<pos+1&&!flat;i++)
{
l=1,r=MAX-1;
while(l<=r)
{
if(a[l]+a[r]==n-a[i]){flat=true;break;}
if(n-a[i]<a[l]+a[r])r--;
else l++;
}
}
printf("%d %d %d\n",i-1,l,r);
}
return 0;
}