1. 程式人生 > 其它 >TheZealous的每日一水題之 P2678 [NOIP2015 提高組] 跳石頭(二分答案)

TheZealous的每日一水題之 P2678 [NOIP2015 提高組] 跳石頭(二分答案)

【思路】

利用二分和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 }

水完!