7月18日刷題記錄 二分答案跳石頭遊戲Getting

Tido發表於2019-07-18

通過數:1

 

明天就要暑假程式設計集訓啦~莫名開心

今天做出了一道 二分答案題(好艱辛鴨

 

1049: B13-二分-跳石頭遊戲(二分答案)

時間限制: 5 Sec  記憶體限制: 256 MB
提交: 30  解決: 12
[提交] [狀態] [討論版] [命題人:外部匯入]

題目描述



樣例輸入

25 5 2
2
14
11
21
17

樣例輸出

4

提示


參考check函式:

    bool check(int x)

    int tot=0;
    if(tot>m)return 0;
    int last=0;
    for(int i=1;i<=n;i++)
        if(a[i]-a[last]<x)
        {
            tot++;
            if(tot>m)return false;
        }
        else last=i;
    return true;
}
/*
1049: B13-二分-跳石頭遊戲(二分答案)
時間限制: 5 Sec  記憶體限制: 256 MB
提交: 26  解決: 11
[提交] [狀態] [討論版] [命題人:外部匯入]
題目描述



樣例輸入

25 5 2
2
14
11
21
17


樣例輸出

4


提示

參考check函式:

bool check(int x)
{ 
    int tot=0;
    if(tot>m)return 0;
    int last=0;
    for(int i=1;i<=n;i++)
        if(a[i]-a[last]<x)
        {
            tot++;
            if(tot>m)return false;
        }
        else last=i;
    return true;
}

來源/分類
B13-二分 

[提交] [狀態]
*/ 
#include<bits/stdc++.h>
using namespace std;
int L,n,m,a[50005];
bool check(int x)
{ 
    int tot=0;
    int last=0;
    for(int i=1;i<=n;i++)
        if(a[i]-a[last]<x)
            tot++;
        else last=i;
    if(tot>m)return false;
    return true;
}
int main(){
    cin>>L>>n>>m;
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    sort(a+1,a+n+1);
    a[n+1]=L;
    int l=0,r=L+1,ans;//那個+1 資料有些坑。。。
    while(l<r){
        
        int mid=(l+r)>>1;
    //    cout<<l<<" "<<r<<" "<<mid<<" "<<check(mid)<<endl;
        if(check(mid)){
            ans=mid;
            l=mid+1;
        }
        else
            r=mid;
        
    }
    cout<<ans;
    return 0;
}

啟示:①要仔細讀題和樣例解釋

②在除錯程式碼的過程中如果一眼找不出錯誤來,當然也不知道程式執行過程中變數數值的變化情況 ,就可以在程式執行時列印變數值←好方法!

還是繼續加油吧886         23:45 Program