Hdu 5248

hdu5248-序列变换

题意:

给你一个序列A,要求改变序列A中的某些元素的顺序,形成一个新的数列B,并保证数列B严格单调递增,求出最小代价。
代价计算公式 $ cost(a,b)=max(|A_i - B_i|) $ 。

解法:

和跳石头那道题类似,通过二分答案不断缩小范围,再每次贪心的取最小值即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

#define LL long long
#define N 100010

int ans,cnt = 1;
int a[N],n,T,tmp;

inline bool check(int x) {
    int pre = a[1] - x;
    for(int i = 2 ; i <= n ; i++) {
        if(a[i] + x <= pre) return 0;
        pre = max(pre + 1, a[i] - x);
    }
    return 1;
}

int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        tmp = 0;
        for(int i = 1 ; i <= n ; i++) {
            scanf("%d",&a[i]);
            if(tmp < a[i]) tmp = a[i];
        }
        int l = 0, r = 0x3f3f3f, ans;
        while(l <= r) {
            int mid = (l + r) >> 1;
            if(check(mid)) {
                r = mid - 1;
                ans = mid;
            } else l = mid + 1;
        }
        printf("Case #%d:\n%d\n",cnt++,ans);
    }
    //system("pause");
    return 0;
}
posted @ 2019-08-23 17:10  西窗夜雨  阅读(157)  评论(0编辑  收藏  举报