CODEVS 2072 分配房间
2016-09-27 09:18
225 查看
题目描述 Description
yh拥有一条街道,街道上共有n间房子,每间房子的坐标为xi(yh的房子比较神奇,可能重叠)。
同时,yh有m个女朋友(这是事实),yh打算给每位女朋友分配一间房子。两个女朋友间的距离相隔越近,她们之间产生冲突的可能就越高。yh想尽可能的减小女朋友间的冲突,于是他打算让他的女朋友间的最小距离最大,你能帮yh找出这个最大值吗?
输入描述 Input Description
第一行两个整数,n,m,表示yh有n间房子,有m个女朋友
第二行为n个整数,xi,表示各间房子的坐标。
输出描述 Output Description
输出1行,表示yh女朋友间的最小距离的最大值
样例输入 Sample Input
5 3
1 2 8 4 9
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
对于30%的数据,n<=100,m<=n,0<=xi<=10000;
对于100%的数据,n<=100000 ,m<=n,0 <= xi <= 1000000000
做个题还TM虐狗….神TM 10^6个女朋友。
应该很好看出来,这个题形如NOIP2015D2T1。
一开始,我们将房子的坐标小到大sort一遍,二分时,r=0,l=max xi即可,为什么说这个题形如跳石头呢,看上面的样例,5个房子给3个妹子住,显然,有2个是空着的,这个跳石头里面的“移走几块石头”差不多,像样例这种情况,要移走2个房间。
开一个变量haha=(房子总数n-妹子总数m),
在判断函数里对于每一个mid值(判断函数里面是x),我们for的时候开一个变量t=i+1,当num[t]-num[i]< mid时,我们需要增大t,这样就会多出来一些空房子,开一个变量tot记录空房子的总数,如果tot<=haha,说明移走的房子数太少,我们需要增大mid的值(如果tot==haha,减小mid的值不会有更优解,因为他打算让他的女朋友间的最小距离最大),当tot>haha时,说明mid的值需要减小,因为本题中要求最小距离最大,所以l每次更新时,让ans和mid取个max。
(第一次提交这题就AC了的我表示非常恐慌)
yh拥有一条街道,街道上共有n间房子,每间房子的坐标为xi(yh的房子比较神奇,可能重叠)。
同时,yh有m个女朋友(这是事实),yh打算给每位女朋友分配一间房子。两个女朋友间的距离相隔越近,她们之间产生冲突的可能就越高。yh想尽可能的减小女朋友间的冲突,于是他打算让他的女朋友间的最小距离最大,你能帮yh找出这个最大值吗?
输入描述 Input Description
第一行两个整数,n,m,表示yh有n间房子,有m个女朋友
第二行为n个整数,xi,表示各间房子的坐标。
输出描述 Output Description
输出1行,表示yh女朋友间的最小距离的最大值
样例输入 Sample Input
5 3
1 2 8 4 9
样例输出 Sample Output
3
数据范围及提示 Data Size & Hint
对于30%的数据,n<=100,m<=n,0<=xi<=10000;
对于100%的数据,n<=100000 ,m<=n,0 <= xi <= 1000000000
做个题还TM虐狗….神TM 10^6个女朋友。
应该很好看出来,这个题形如NOIP2015D2T1。
一开始,我们将房子的坐标小到大sort一遍,二分时,r=0,l=max xi即可,为什么说这个题形如跳石头呢,看上面的样例,5个房子给3个妹子住,显然,有2个是空着的,这个跳石头里面的“移走几块石头”差不多,像样例这种情况,要移走2个房间。
开一个变量haha=(房子总数n-妹子总数m),
在判断函数里对于每一个mid值(判断函数里面是x),我们for的时候开一个变量t=i+1,当num[t]-num[i]< mid时,我们需要增大t,这样就会多出来一些空房子,开一个变量tot记录空房子的总数,如果tot<=haha,说明移走的房子数太少,我们需要增大mid的值(如果tot==haha,减小mid的值不会有更优解,因为他打算让他的女朋友间的最小距离最大),当tot>haha时,说明mid的值需要减小,因为本题中要求最小距离最大,所以l每次更新时,让ans和mid取个max。
(第一次提交这题就AC了的我表示非常恐慌)
#include<cstdio> #include<algorithm> using namespace std; const int maxn=100000+500; int n,m; int num[maxn]; int haha; bool can(int x) { int tot=0; for(int i=1;i<=n;) { int t=i+1; while(num[t]-num[i]<x&&t<=n) { t++; tot++; } i=t; } if(tot<=haha) return false; return true; } int div() { int l=0; int r=1000000000; haha=n-m; int ans=0; while(l<=r) { int mid=(l+r)>>1; if(can(mid)) { r=mid-1; } else { l=mid+1; ans=max(ans,mid); } // printf("l:%d r:%d\n",l,r); // printf("ans:%d",ans); } return ans; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&num[i]); } sort(num+1,num+n+1); printf("%d",div()); return 0; }
相关文章推荐
- 【基础练习】【二分】codevs2072 分配房间题解
- CODEVS 2702 分配房间
- 2072 分配房间 二分
- 别墅房间 CodeVS原创
- codevs2072 分配房间
- [CODEVS1915] 分配问题(最小费用最大流)
- codevs3410 别墅房间
- codevs 2072 分配房间(贪心+二分)
- [网络流24题][CODEVS1915]分配问题(网络流)
- 【Codeforces Round 330 (Div 2)A】【水题】Vitaly and Night 多少间房间有人
- Codevs 2833 奇怪的梦境
- 统计单词个数(codevs 1040)
- Codevs 1005 生日礼物
- codevs1746 贪吃的九头龙
- visual studio code(vscode) 调试php(转)
- vs code不同后缀的文件按图标区分,如.vue .md
- 【CodeVS1094】【NOIP2004】FBI树
- codevs1068 乌龟棋==洛谷P1541 乌龟棋
- codevs1322 单词矩阵
- 【题解】 codevs1074 洛谷2024 食物链 详述 《高级数据结构》-林厚从