POJ:2456 Aggressive cows(z最大化最小值)
描述
农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).
但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?
- 输入
- 第一行:空格分隔的两个整数N和C
第二行——第N+1行:分别指出了xi的位置 - 输出
- 每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。
- 样例输入
-
5 3
1
2
8
4
9 - 样例输出
-
3
意要表达的是:把C头牛放到N个带有编号的隔间里,使得任意两头牛所在的隔间编号的最小差值最大。
分析:这是一个最小值最大化的问题。先对隔间编号从小到大排序,则最大距离不会超过两端的两头牛之间的差值,最小值为0。所以我们可以通过二分枚举最小值来求。假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛,说明当前的x有点小,就先让x变大再判断;如果放不下,说明当前的x太大了,就先让x变小然后再进行判断。直到求出一个最大的x就是最终的答案。
现在来搞下解题步骤:
C(d)=可以安排牛的位置使得最近的两头牛的距离都不小于d
那么现在问题就变成求满足C(d) 的最大d,另外最近的间距不小于d也可以说成是所有牛的间距不小于d;
在问题上的判断使用贪心法便可以非常容易地求解。
1.对牛舍的位置x进行排序
2.把第一头牛放入x0的牛舍
3.如果第i头牛放入了xj的话,第i+1头牛就要放入满足xj+d<=xk 的最小的xk中
AC 代码:
#include<stdio.h>
#include<algorithm>
#define MAX 101000
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int a[MAX];
bool C(int d)
{
int last=;
for(int i = ; i < m ; i++)
{
int crt=last+;
while(crt<n&&a[crt]-a[last]<d)///只需要比较k-1次找出最适合的值d来搞k头牛,用last&crt来表示上一头牛和当前牛的位置
crt++;
if(crt==n)
return false;///到达最大值n。说明d的值小了
last = crt;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = ; i < n ; i++)
scanf("%d",&a[i]);
sort(a,a+n);
int st = ,en=INF,mid;
while(en-st>)
{
mid=(en+st)/;
if(C(mid)==false)
en=mid;
else
st=mid;
}
printf("%d\n",(en+st)/);///个人突杨想到的问题,因为我不知道是en还是st
}另一种解法:
#include<stdio.h>
#include<algorithm>
#define MAX 101000
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int a[MAX];
bool C(int d)
{
int sum=;
int ans=;
for(int i=;i<n;i++)
{
if((sum+a[i]-a[i-])<d)
{
sum+=a[i]-a[i-]; }
else
{
sum=;
ans++;
}
}
if(ans>=m)
return true;
return false;
}
int main()
{
int en=-,st=INF;
scanf("%d%d",&n,&m);
for(int i = ; i < n ; i++)
{
scanf("%d",&a[i]);
} sort(a,a+n);
en=a[n-]-a[];
for(int i=;i<n;i++)
{
st=min(st,a[i]-a[i-]); }
while(en-st>)
{
int mid=(en+st)/;
if(C(mid))
st=mid;
else
en=mid;
}
printf("%d\n",(st+en)/);///个人突杨想到的问题,因为我不知道是en还是st
}
POJ:2456 Aggressive cows(z最大化最小值)的更多相关文章
- POJ - 2456 Aggressive cows 二分 最大化最小值
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18099 Accepted: 8619 ...
- poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分
poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分 题目链接: nyoj : http://acm.nyist.net/JudgeOnline/ ...
- 二分搜索 POJ 2456 Aggressive cows
题目传送门 /* 二分搜索:搜索安排最近牛的距离不小于d */ #include <cstdio> #include <algorithm> #include <cmat ...
- POJ 2456 Aggressive cows (二分 基础)
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7924 Accepted: 3959 D ...
- POJ 2456 Aggressive cows (二分)
题目传送门 POJ 2456 Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) s ...
- POJ 2456 Aggressive cows
Aggressive cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11192 Accepted: 5492 ...
- [POJ] 2456 Aggressive cows (二分查找)
题目地址:http://poj.org/problem?id=2456 最大化最小值问题.二分牛之间的间距,然后验证. #include<cstdio> #include<iostr ...
- POJ 2456 Aggressive cows ( 二分搜索)
题目链接 Description Farmer John has built a new long barn, with N (2 <= N <= 100,000) stalls. The ...
- POJ 2456 Aggressive cows(贪心 + 二分)
原题链接:Aggressive cows 题目大意:农夫 建造了一座很长的畜栏,它包括 个隔间,这些小隔间依次编号为. 但是, 的 头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争 ...
随机推荐
- 62-U型数字
https://nanti.jisuanke.com/t/20683 #include <iostream> using namespace std; int main(){ int ct ...
- c语言学习笔记 多级else if 和switch case有什么区别
; ) { dosth(); } ) { dosth2(); } else if(opion==) { dosth3(); } else dosth4(); 如果给option的一个值是2的话,那么程 ...
- django: django rest framework 分页
django: django rest framework 分页 2018年06月22日 13:41:43 linux_player_c 阅读数:665更多 所属专栏: django 实战 版权声 ...
- keydown、input 和 keyup 事件
keydown.keyup 属于键盘事件,input 属于文本事件. keydown:当用户按下键盘上的任意按键时触发,如果按住不放,会重复触发此事件. keyup:当用户释放键盘上的按键时触发. i ...
- LibreOJ 6002 最小路径覆盖(最大流)
题解:最小路径覆盖=总点数减去最大匹配数,拆点,按照每条边前一个点连源点,后一个点连汇点跑最大流,即可跑出最大匹配数,然后减一减就可以了~ 代码如下: #include<queue> #i ...
- Maven整理笔记の初步窥探
第一部分:引言 Maven是一款跨平台的项目管理工具,作为Apache组织的一个开源项目,主要服务于基于java平台的项目构建.依赖管理和项目信息管理. 项目构建:编译.运行单元测试.生成文档.打包和 ...
- 用原生css实现高斯模糊、黑白等滤镜效果
—引导— 在CSS3中,有一个强大的属性,那就是filter属性,filter顾名思义就是“滤镜”的意思,用filter属性可以让图片无需PS处理就达到一些简单的显示效果. —定义和使用— filte ...
- HackTen 格式化TextView的文本
1.概要: TextView是Android提供的一个简单却功能强大的UI控件.读者可以在应用程序中通过多种方法使用不同样式的文本. 监管TextView并不支持所有HTML标签,但是用于格式 ...
- 将以太坊封装为 ERC20
将以太坊封装为 ERC20 TOKEN 很多 DAPP 都是在处理 ERC20接口的 token, 其实很容易将以太坊封装为 ERC20,这样就可以统一处理, 至少我目前在做的雷电网络就是这么处理的. ...
- 洛谷题解 P2865 【[USACO06NOV]路障Roadblocks】
链接:https://www.luogu.org/problemnew/show/P2865 题目描述 Bessie has moved to a small farm and sometimes e ...