Vijos P1763 Wormhole

来源:互联网 发布:沙滩鞋淘宝 编辑:程序博客网 时间:2024/06/03 20:16

贪心题目。

显然可以发现一个性质。。。

接下来就是二分判断。。

首先二分一个最大路径,然后枚举虫洞的位置,考虑冲突时决策的调整。

先将虫洞的位置设在第一个到1距离>mid的点,然后继续向后扫描,

发现一个点j到i的距离也大于mid,这样就将j-1设成虫洞,然后看后面的点到j-1的距离是否符合要求。

这样做一定是最优的。(因为要想满足全部条件,首先局部必须满足,否则就无法满足全部条件,因此一步一步的考虑)



#include<cstdio>using namespace std;int n,t,d[200000],x[200000];bool check(int mid){int j;for(int i=1;i<=n;i++)if(d[i]>mid) {for(j=i;j<=n+1;j++) if(d[j]-d[i]>mid) break;for(int k=j;k<=n;k++){if(d[k]-d[j-1]>mid) return false;}return true; }return true;}int main(){scanf("%d",&t);for(int k=1;k<=t;k++){int l=0,r=1000000000,mid,ans=999999999;    scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&x[i]);d[i]=x[i]-x[1];}if(k==2) check(1);while(l<=r){mid=(l+r)/2;if(check(mid)) {ans=mid; r=mid-1;}else l=mid+1;}printf("%d\n",ans);}}


0 0
原创粉丝点击