洛谷 P1316 丢瓶盖 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 P1316 丢瓶盖 题解相关的知识,希望对你有一定的参考价值。
此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置。
题目链接 :https://www.luogu.org/problem/show?pid=1316
题目描述
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入输出格式
输入格式:第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个瓶盖坐标。
输出格式:仅一个整数,为所求答案。
输入输出样例
输入样例#1:
5 3 1 2 3 4 5
输出样例#1:
2
说明
限时3秒
分析:
二分答案裸题...今天的三道题交的几乎可以交同一份代码(然而我对这道题改了一下)。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 6 using namespace std; 7 int a,b,num[100005],l,r; 8 9 inline void read(int &x) 10 { 11 char ch = getchar(),c = ch;x = 0; 12 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 13 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 14 if(c == ‘-‘) x = -x; 15 } 16 17 bool jud(int x) 18 { 19 int cnt = 1; 20 int tmp = num[1]; 21 for(int i = 2;i <= a;++ i) 22 { 23 if(num[i] - tmp >= x) 24 cnt ++,tmp = num[i]; 25 } 26 if(cnt >= b) return true; 27 return false; 28 } 29 30 int main() 31 { 32 read(a),read(b); 33 for(int i = 1;i <= a;++ i) 34 read(num[i]); 35 sort(num+1,num+1+a); 36 l = 1,r = num[a]-num[1]; 37 int mid,ans = 0; 38 while(l <= r) 39 { 40 mid = ((l+r)>>1); 41 if(jud(mid)) l = mid+1,ans = mid; 42 else r = mid-1; 43 } 44 printf("%d\n",ans); 45 return 0; 46 }
以上是关于洛谷 P1316 丢瓶盖 题解的主要内容,如果未能解决你的问题,请参考以下文章