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
",ans);
52     return 0;
53 }
原文地址:https://www.cnblogs.com/zyb993963526/p/7440570.html