HDU5248

這是一道二分題,然而我做了好久都沒有發現~~~
跟去年的跳石頭有點相似,不斷縮小範圍:

#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 100000000
using namespace std;
int a[100010],m,b[100010];
int check(int x){
    for(int i=1;i<=m;i++)b[i]=a[i];
    b[1]-=x;
    for(int i=2;i<=m;i++){
        b[i]-=x;
        if(b[i-1]>=b[i]){
        if (abs(x-(b[i-1]-b[i]+1))<=x)b[i]=b[i-1]+1;else return 0;
        }
    }
    return 1;
}
int main(){
    int i,j,k,n,_,Case=0;
    scanf("%d",&_);
    while(_--){
        Case++;
        bool flag=0;
        scanf("%d",&m);
        scanf("%d",&a[1]);
        for(i=2;i<=m;i++){
            scanf("%d",&a[i]);
            if(a[i]<=a[i-1])flag=1;
        }
        if(!flag){
            printf("Case #%d:\n%d\n",Case,0);
            continue;
        }
        int l=0,r=inf;
        while(l<=r){
            int mid=(l+r)/2;
            if(check(mid))r=mid-1;
            else l=mid+1;
        }
        printf("Case #%d:\n%d\n",Case,l);
    }


    return 0;
}
發佈了55 篇原創文章 · 獲贊 52 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章