题目链接:ZOJ 3768 Continuous Login
任何数都可以由最多三组前n项和组成,我也不知道为什么,比赛时候队友是这么说的。。
然后就可以枚举这三种情况了,一组很简单,两组时候二分寻找答案(他们说这叫夹逼。。高数都还给老师了。。),三组时候先枚举一组,之后再二分寻找剩下两组。
#include <iostream>
#include <algorithm>
const int MAX_N = 15713;//前15713项和为123456789,前15712项和为123456789
using namespace std;
int sum[MAX_N];
int T, n, l, r, pos;
bool solve(int n)
{
l = 1;
r = pos - 1;
int res;
while(l <= r)
{
res = sum[l] + sum[r];
if(res == n)
return true;
else if(res > n)
r--;
else if(res < n)
l++;
}
return false;
}
int main()
{
sum[0] = 0;
for(int i = 1; i <= MAX_N; i++)
sum[i] = sum[i - 1] + i;
cin >> T;
while(T--)
{
cin >> n;
pos = lower_bound(sum, sum + MAX_N, n) - sum;//low——bound返回大于等于n的第一个数的指针
if(sum[pos] == n)
cout << pos << endl;
else
{
if(solve(n))
{
cout << l << " " << r << endl;
continue;
}
for(int i = 1; i <= pos - 1; i++)
{
if(solve(n - sum[i]))
{
cout << l << " " << r << " " << i << endl;
break;
}
}
}
}
return 0;
}