首先数据范围达到了1e9,这样的话哪怕 O ( n ) O(n) O(n)的做法都不能过,所以我们手玩样例找规律
如果每次都减1的话,看上去减的数多,但是实际上需要n次,每次选择最大的减去全部,也需要n次,那么我们越往中间靠近总次数就越少,这是本题的第一感觉。
我们如果画图的话
1
11
111
1111
11111
111111
我们发现果然中间的正方形是要比边的大,所以我们每次取一半分开两部分,分别减掉两部分的最小值,这样就会变成两个相同的两部分,排序后再分开减半,最后答案就是log2n+1,我们可以直接用cmath库中的log2函数输出答案即可。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#include<cstdlib>
#include<ctime>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 500007, M = 5000007, INF = 0x3f3f3f3f;
int main()
{
int n;
while(~scanf("%d", &n))
printf("%d\n", (int)log2(n) + 1);
return 0;
}