zoukankan      html  css  js  c++  java
  • 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:
    %d
    ",cnt++,ans);
        }
        //system("pause");
        return 0;
    }
    
  • 相关阅读:
    观察者模式
    模版方法
    event
    设计模式之观察者模式
    BOM
    javascript基础语法&4
    Document Object Model
    javascript基础语法&3
    javaScript基础语法&1
    sublimeText3安装
  • 原文地址:https://www.cnblogs.com/Repulser/p/11401298.html
Copyright © 2011-2022 走看看