疯牛
-
描述
-
农夫 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 3 1 2 8 4 9
样例输出
-
3
来源
-
nyoj586
这是一道比较容易理解的二分+贪心的题目,二分的思想主要是用来找出最后的结果x。看在长度为x时能放几头牛然后根据结果增大或者减小x最后使得x等于所求的结果。
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; int a[100005],n,c; int judge(int m) { int cnt=1,t=a[0]; for(int i=1;i<n;i++) { if(a[i]-t>=m) { cnt++; t=a[i]; if(cnt>=c) return 1; } } return 0; } void binary() { int l=0,h=a[n-1]-a[0],m; //l为长度最小值0,h为长度最大值 while(l<=h) { m=(l+h)/2; if(judge(m)) l=m+1; else h=m-1; } cout << l-1 << endl; } int main() { while(cin >> n >> c) { int i; for(i=0;i<n;i++) scanf("%d",&a[i]); sort(a,a+n); binary(); } return 0; }
Yougth的最大化
时间限制: 1000 ms | 内存限制: 65535 KB难度: 4-
描述
-
Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?
-
输入
-
有多组测试数据
每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
输出
- 输出使得单位价值的最大值。(保留两位小数) 样例输入
-
3 2 2 2 5 3 2 1
样例输出
-
0.75
来源
-
有多组测试数据
这题相较上一题比较难看出是二分+贪心,一开始肯定认为是直接算每个物品的平均价值,然后贪心就行,但是从样例可以看出显然是不对的。这题比较的是v[i]-x*w[i]求和的值和0(可以通过数学推导得出),注意题目保留的两位小数,结束二分的条件差小于0.01就行了(保险起见小于了0.001)。
-
-
有多组测试数据,以EOF结束。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int w[10005],v[10005],n,c;
double y[10005];
int judge(double x)
{
for (int i=0;i<n;i++)
y[i]=v[i]-x*w[i];
sort(y,y+n);
double sum=0;
for (int i=0;i<c;i++)
sum+=y[n-i-1];
return sum>=0;
}
void binary(double max)
{
double l=0,r=max,m;
while (r-l>=0.001)
{
m=(l+r)/2;
if (judge(m)) l=m;
else r=m;
}
printf("%.2lf\n",l);
}
int main()
{
while(cin >> n >> c)
{
double max;
for (int i=0;i<n;i++)
{
scanf("%d%d",&w[i],&v[i]);
if ((double)v[i]/w[i]>max)
max=(double)v[i]/w[i];
}
binary(max);
}
return 0;
}
又见疯牛,这是一道和疯牛一模一样的题目,就连数据都一模一样,完全就是换汤不换药。
yh拥有一条街道,街道上共有n间房子,每间房子的坐标为xi(yh的房子比较神奇,可能重叠)。
同时,yh有m个女朋友(这是事实),yh打算给每位女朋友分配一间房子。两个女朋友间的距离相隔越近,她们之间产生冲突的可能就越高。yh想尽可能的减小女朋友间的冲突,于是他打算让他的女朋友间的最小距离最大,你能帮yh找出这个最大值吗?
第一行两个整数,n,m,表示yh有n间房子,有m个女朋友
第二行为n个整数,xi,表示各间房子的坐标。
输出1行,表示yh女朋友间的最小距离的最大值
5 3
1 2 8 4 9
3
对于30%的数据,n<=100,m<=n,0<=xi<=10000;
对于100%的数据,n<=100000 ,m<=n,0 <= xi <= 1000000000