UVA11384 Help is needed for Dexter (规律、思维)

首先数据范围达到了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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45697774/article/details/108696977