POJ 2456 Aggressive cows

Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The stalls are located along a straight line at positions x1,...,xN (0 <= xi <= 1,000,000,000).

His C (2 <= C <= N) cows don't like this barn layout and become aggressive towards each other once put into a stall. To prevent the cows from hurting each other, FJ want to assign the cows to the stalls, such that the minimum distance between any two of them is as large as possible. What is the largest minimum distance?
Input
* Line 1: Two space-separated integers: N and C 

* Lines 2..N+1: Line i+1 contains an integer stall location, xi
Output
* Line 1: One integer: the largest minimum distance
Sample Input
5 3
1
2
8
4
9
Sample Output
3
Hint
OUTPUT DETAILS: 

FJ can put his 3 cows in the stalls at positions 1, 4 and 8, resulting in a minimum distance of 3. 

Huge input data,scanf is recommended.

这道题的意思就是农夫有n个stuff,如果一个stuff里面有两头牛他们就会打架,所以我们尽可能分开它们,而且要尽量远,农夫想知道分开它们后各两头牛距离之中最小值是多少。

这道题,不会。。。于是搜题解,文字题解,看不懂。。。于是看代码,于是懂了。

思路就是,先把各个stuff排序一下,这样我就知道最大最小的距离了,而且我们要在这个距离之内将stuff分成c-1份,所以最大距离dis就是(stuff[n - 1] - stuff[0]) / (c - 1)。两头牛之间的距离平均下来不可能比这个更大了,也就是我们要求的最小值MIN不可能大于这个数字了。比如1 3 5分三头牛,那dis = 2,这是刚好的,如果是1 2 5,那么答案其实是在(0,2)之间产生的,这也就是这道题用二分的思路。二分的操作,无异于left = mid+ 1,right = mid - 1,一直二分下去看看哪个dis恰好不满足(比如1 3 5,第一步操作后left = 3,然后在3 到 5 之间二分,变成[3,3]),那么left - 1就是满足的了。

代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int stuff[1000005], dval[1000005], n, c;

bool Find(int mid)
{
	int tmp = 0, cnt = 0;
	for(int i = 0; i < n - 1; i++)
	{
		tmp += dval[i];
		if(tmp >= mid)
		{
			cnt++;
			tmp = 0;
		}
	}
	if(cnt >= c - 1)
		return 1;
	return 0;
}

int main()
{
	int left, right, mid;
	cin >> n >> c;
	for(int i = 0; i< n ; i++)
		scanf("%d", &stuff[i]);
	sort(stuff, stuff + n);
	for(int i = 0; i < n - 1; i++)
		dval[i] = stuff[i + 1] - stuff[i];
	left = 0;
	right = (stuff[n - 1] - stuff[0]) / (c - 1);
	while(right - left > 1)
	{
		mid = (right + left) / 2;
		if(Find(mid))
			left = mid;
		else
			right = mid;
	}
	if(Find(right))
		cout << right << endl;
	else
		cout << left << endl;
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CMP4播放器 456Vv后台系统个人版 用户:admin 密码:admin888 http://localhost/admin/ admin目录使用时,要改个名字,改个别人猜不着的文件夹名字,否则会造成数据有丢失的可能。 20101014 1,增加vplayer、webplayer两个皮肤 2,增加几个全局参数 3,更新了官方晨风播放器核心程序 20100829更新 1,增加几个全局参数 2,优化一些BUG 3,更新了官方晨风播放器核心程序 20100804更新 1,单曲分享增加卡拉OK歌词 2,优化一些BUG 3,更新了官方晨风播放器核心程序 20100719更新 1,增强在线代理功能(支持抓取301 302 页面 HTTP头部信息,需要设置Range:bytes=0-0) 20100718更新 1,增加在线代理功能 2,增加可插入XML列表 3,支持rtmp协议文件播放(请将rtmp地址放入"普通外链" 或者 "高级外链"里外,才能有效支持。) 4,优化一些BUG 5,更新了官方晨风播放器核心程序 20100701更新 1,缓存存储数据提升反应速度 2,优化"代理下载"下载速度 3,优化一些BUG 4,更新了官方晨风播放器核心程序 5,增加tvlive单曲皮肤 20100619更新 1,纠正IE8支持MMS协议文件播放 (如果还不能播放:开始--程序--Windows Media Player--工具--选项--连接到到internet (忽略其他命令)--打勾--确定) 2,优化一些BUG 20100616更新 1,优化/加强单曲分享 2,增加MOKO美空皮肤 20100613更新 1,新增单曲分享功能 2,优化生成XML文件减小 3,纠正MMS协议流媒体播放BUG 4,更新了官方晨风播放器核心程序 20100605更新 1,更新了歌曲列表行可显示删除 2,更新了官方晨风播放器核心程序 20100530更新 1,纠正播放器首播时候指定歌曲ID播放 2,更新了官方晨风播放器核心程序 20100515更新 1,更新高级盗连功能,支持POST提交取数据 2,更新数据恢备份功能 20100509更新 1,可以增加二级栏目(升级数据库) 20100426更新 1,支持MMS协议流媒体文件播放 20100416更新 1,纠正高级盗链不能获取网址带汉字问题 2,新增歌曲地址失效检测功能 3,修正上传图片安全问题 20100411更新(升级版) 1,升级数据库 2,升级页面代码 3,升级盗链功能 4,升级支持更多参数设置 4,支持迅雷、快车、URL编码 地址转换 5,支持代理下载 6,支持URL参数,如:start={start_bytes} start={start_seconds} 20100401更新 1, 出现生成歌词的BUG 2010330更新 1,纠正外连变动字段功能。 2,纠正播放器可放入子目录使用。 2010329更新 1,增加外连(自动更新MP3地址) 2,纠正了一些BUG 如有什么不懂或者有BUG,请加我QQ:276 846 259 最新下载:http://qq276846259.download.csdn.net/ 最新播放器皮肤下载:http://www.cenfun.com/ 伤感歌曲:http://www.456vv.com/

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值