51nod 1243 排船的问题(二分)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1243
题意:
思路:
二分来做,每次贪心的把船安排到能安排的最左边即可。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 #include<set> 11 using namespace std; 12 typedef long long ll; 13 const int INF = 0x3f3f3f3f; 14 const int maxn=50000+5; 15 16 int n,x,m; 17 int pos[maxn]; 18 19 bool judge(int d) 20 { 21 int st=2*x; 22 for(int i=1;i<=n;i++) 23 { 24 while(true) 25 { 26 if(st>m) return 0; 27 if(abs(st-x-pos[i])<=d) {st+=2*x;break;} //如果绳子小于等于d的话,那么就进行下一艘船 28 else 29 { 30 if(pos[i]<st-x) return 0; //如果超过了且木桩在船中心的左边,那肯定是不行的,因为我们船都是贪心的放在最左边的位置 31 st+=(pos[i]-(st-x)-d); //如果在右边,则移动到正好距离为d的位置点 32 } 33 } 34 } 35 return 1; 36 } 37 38 int main() 39 { 40 //freopen("in.txt","r",stdin); 41 scanf("%d%d%d",&n,&x,&m); 42 for(int i=1;i<=n;i++) scanf("%d",&pos[i]); 43 if(n*2*x>m) {puts("-1");return 0;} 44 int left=0,right=m-1,ans; 45 while(left<=right) 46 { 47 int mid=(left+right)>>1; 48 if(judge(mid)) {ans=mid;right=mid-1;} 49 else left=mid+1; 50 } 51 printf("%d\n",ans); 52 return 0; 53 }