通過數:1
明天就要暑假程式設計集訓啦~莫名開心
今天做出了一道 二分答案題(好艱辛鴨)
1049: B13-二分-跳石頭遊戲(二分答案)
提交: 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