(贪心+整数型二分答案)
题目常包含:“最短的最大距离”,“最大的最短距离”
1.计网
2.洛谷P1824进击的奶牛
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int maxn=100007; const double eps=1e-8; int n,c; int x[maxn]; int le=1,ri,mid; int main(){ scanf("%d%d",&n,&c); for(int i=0;i<n;i++){ scanf("%d",&x[i]); } sort(x,x+n); ri=x[n-1]; int last=1; while(le<=ri){ mid=(le+ri)/2; if(last==mid){ break; } last=mid; int sum=x[0]+mid,cnt=1; for(int i=2;i<n;i++){ if(sum<=x[i]){ cnt++; sum=x[i]+mid; } } if(cnt<c){ ri=mid-1; } else le=mid+1; } printf("%d ",r1); }
3.洛谷P1316 丢瓶盖
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int maxn=100007; int n,c; int x[maxn]; int le=1,ri,mid; int main(){ scanf("%d%d",&n,&c); for(int i=0;i<n;i++){ scanf("%d",&x[i]); } sort(x,x+n); ri=x[n-1]-x[0]; while(le<=ri){ mid=(le+ri)/2; int sum=x[0]+mid,cnt=1; for(int i=2;i<n;i++){ if(sum<=x[i]){ cnt++; sum=x[i]+mid; } } if(cnt<c){ ri=mid-1; } else le=mid+1; } printf("%d ",ri); }