链接:
https://codeforces.com/problemset/problem/1455/B
题意
有一个点,值为x,为类似数组a1,a2,a3,…ai的和,规定从0开始,从a1开始,每次可以选择加ai中的i,或者选择-1。
问最少为几个a的和?(有多组案例)
Example
input
5
1
2
3
4
5
output
1
3
2
3
4
解析
可以发现如果都是选择+i的话,和相当于为公差为1的等差数列的前n项和:1 + 2 + 3 + 4 + 5 +…+ n = n * (n + 1) / 2;将这个值与x进行对比,如果正好等于,则此刻的n即为正确答案。
如果大于再进行特别判断;设前n项和为t,判断t - 1和x的关系,如果t - 1 = x,说明再原有的n个数上还要再来一次-1的操作,所以答案就为n + 1;
如果t - 1 > x;用t - 1减去x得到值w = t - 1 - x;会发现该值一定是小于n的,所以都能在前面中找到该值,该值说明的是x与前n项和t相差w + 1,所以如果把前面中出现的w值那一步替换成-1,即t - w - 1 = t - (w + 1);此时结果就会得到x的值。
举个例子如下:
#include <iostream>
using namespace std;
int main()
{
int _;
cin >> _;
while (_--)
{
int x;
cin >> x;
int n = 0;
while ((n + 1) * n / 2 < x)
{
n++;
}
int t = n * (n + 1) / 2 - 1;
if (t == x) n++;
cout << n << endl;
}
return 0;
}