TheZealous的每日一水題之 P2678 [NOIP2015 提高組] 跳石頭(二分答案)
阿新 • • 發佈:2021-07-18
【思路】
利用二分和judge函式判斷當前二分所得中點值是否為該問題的解,並嘗試更新解以求得最優解。
【程式碼】
1 #include <bits/stdc++.h> 2 using namespace std; 3 int l,m,n; 4 int a[50005]; 5 int ans; 6 int judge(int x) 7 { 8 int sum=0; 9 int i=0; 10 int now=0; 11 while(i<n+1){//注意細節,大於號 12 i++; 13 if(a[i]-a[now]<x) sum++;//判斷當前所處的石頭與下一塊石頭間距是否大於中點值
//若小於,則不符合中點值為最小值的假設,該石頭可移走,反之同理14 else now=i;} 15 if(sum>m) return 0; 16 else return 1; 17 } 18 19 int main() 20 { 21 scanf("%d %d %d",&l,&n,&m); 22 for(int i=1;i<=n;i++){ 23 scanf("%d",&a[i]); 24 } 25 a[n+1]=l; 26 int ll=0; 27 int rr=l; 28 while(rr-ll>=0){ 29 int mid=(rr+ll)>>1; 30 if(judge(mid)) 31 { 32 ans=mid; ll=mid+1; 33 }//二分!考慮二分本質! 34 else rr=mid-1; 35 } 36 printf("%d",ans); 37 return 0; 38 }
水完!