C语言之贪心算法
来源:互联网 发布:应知故乡事的前一句 编辑:程序博客网 时间:2024/06/06 12:32
疯牛
时间限制:1000 ms | 内存限制:65535 KB
难度:4
- 描述
- 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000).
但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗。为了不让牛互相伤害。John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢?- 输入
- 有多组测试数据,以EOF结束。
第一行:空格分隔的两个整数N和C
第二行——第N+1行:分别指出了xi的位置 - 输出
- 每组测试数据输出一个整数,满足题意的最大的最小值,注意换行。
- 样例输入
5 312849
- 样例输出
3
思路:
题意要表达的是:把C头牛放到N个带有编号的隔间里,使得任意两头牛所在的隔间编号的最小差值最大。
分析:这是一个最小值最大化的问题。先对隔间编号从小到大排序,则最大距离不会超过两端的两头牛之间的差值,最小值为0。所以我们可以通过二分枚举最小值来求。假设当前的最小值为x,如果判断出最小差值为x时可以放下C头牛,说明当前的x有点小,就先让x变大再判断;如果放不下,说明当前的x太大了,就先让x变小然后再进行判断。直到求出一个最大的x就是最终的答案。
代码:
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[100005],n,c;
int judge(int mid)
{
int i,count=1,t=a[0]; //count是指放了几头牛,从1开始。t用来表示当前的房间号
for(i=1;i<n;i++)
{
if(a[i]-t>=mid)//判断两个房间之间的距离
{
count++;
t=a[i];//修改t的值,即修改当前房间号,例如原来t=1,a[2]=4,若a[2]-t>=mid符合,那么t=4,然后算a[3]或者a[4]与t之间的距离。
if(count>=c)//可以放下C头牛
return 1;
}
}
return 0;
}
int binary()//二分搜索符合条件的最小距离的最大值
{
int low=0,high=a[n-1]-a[0],mid;
while(low<=high)
{
mid=(low+high)/2;//mid即为最小房间号与最大房间号之间的距离
if(judge(mid))
low=mid+1;//所求距离>=mid,可以继续增大试探
else
high=mid-1;//所求距离<mid,所以必须减小来试探
}
return low-1; //由于在之前距离+1,所以此时-1
}
int main()
{
while(~scanf("%d%d",&n,&c))
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
printf("%d\n",binary());
}
return 0;
}
#include<algorithm>
using namespace std;
int a[100005],n,c;
int judge(int mid)
{
int i,count=1,t=a[0]; //count是指放了几头牛,从1开始。t用来表示当前的房间号
for(i=1;i<n;i++)
{
if(a[i]-t>=mid)//判断两个房间之间的距离
{
count++;
t=a[i];//修改t的值,即修改当前房间号,例如原来t=1,a[2]=4,若a[2]-t>=mid符合,那么t=4,然后算a[3]或者a[4]与t之间的距离。
if(count>=c)//可以放下C头牛
return 1;
}
}
return 0;
}
int binary()//二分搜索符合条件的最小距离的最大值
{
int low=0,high=a[n-1]-a[0],mid;
while(low<=high)
{
mid=(low+high)/2;//mid即为最小房间号与最大房间号之间的距离
if(judge(mid))
low=mid+1;//所求距离>=mid,可以继续增大试探
else
high=mid-1;//所求距离<mid,所以必须减小来试探
}
return low-1; //由于在之前距离+1,所以此时-1
}
int main()
{
while(~scanf("%d%d",&n,&c))
{
int i;
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
printf("%d\n",binary());
}
return 0;
}
阅读全文
0 0
- C语言之贪心算法
- C语言贪心算法之过河问题
- C语言贪心算法之找点
- C语言贪心算法之非洲小孩
- C语言贪心算法
- 贪心算法之哈夫曼编码(C语言实现)
- C语言之贪心算法(背包问题)
- C语言贪心算法之会议安排问题
- C语言贪心算法之喷水装置(二)
- 贪心算法(C语言实现)
- c/c++算法之贪心与DP
- 贪心算法之装箱问题(c++)
- 贪心算法之贪心的c小加问题
- 纯C语言:贪心Prim算法生成树问题源码
- 纯C语言:贪心Kruskal算法生成树源码
- C语言贪心算法,关于零钱取整问题
- C语言——恐怖水母(贪心算法)
- C语言 之 素数算法
- 千万级并发分布式KV存储系统设计实现和运营
- 1874 字符串排序 (逆序对)
- LinkedList<HashMap<String, Integer>> students = new LinkedList<HashMap<String, Integer>>();
- java设计模式之单例,工厂,代理模式
- 索引概述
- C语言之贪心算法
- LeetCode212. Word Search II
- Kotlin发迹史
- MarchingCube实现(C++ OpenGl代码篇)
- opencv 图像识别程序
- C++
- thymleaf基础
- Java面试题准备
- 创建ROS项目并添加第三方库(curl)进行网络请求