poj3111 二分最大化平均值
2015-08-13 11:10
197 查看
如题:http://poj.org/problem?id=3111
K Best
Description
Demy has n jewels. Each of her jewels has some value vi and weight
wi.
Since her husband John got broke after recent financial crises, Demy has decided to sell some jewels. She has decided that she would keep
k best jewels for herself. She decided to keep such jewels that their specific value is as large as possible. That is, denote the specific value of some set of jewels
S = {i1, i2, …,
ik} as
.
Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.
Input
The first line of the input file contains n — the number of jewels Demy got, and
k — the number of jewels she would like to keep (1 ≤ k ≤ n ≤ 100 000).
The following n lines contain two integer numbers each — vi and
wi (0 ≤ vi ≤ 106, 1 ≤
wi ≤ 106, both the sum of all
vi and the sum of all
wi do not exceed 107).
Output
Output k numbers — the numbers of jewels Demy must keep. If there are several solutions, output any one.
Sample Input
Sample Output
Source
Northeastern Europe 2005, Northern Subregion
思路:选取k个最大化平均值的思路在我上一篇,这里不再赘述。在不断缩小区间的过程中,满足最后一个精度的前k个元素也就是结果。循环100次超时,循环50次6秒。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100005
struct node
{
int v,w,id;
};
node a[MAXN];
struct node1
{
double value;
int id;
}b[MAXN];
bool operator<(node1 x,node1 y)
{
return x.value>y.value;
}
int C(double x,int k,int n)
{
int i;
for(i=0;i<n;i++)
{
b[i].value=a[i].v-x*a[i].w;
b[i].id=a[i].id;
}
sort(b,b+n);
double sum=0;
for(i=0;i<k;i++)
{
sum+=b[i].value;
}
return sum>=0;
}
int cmp(node1 x,node1 y)
{
return x.id<y.id;
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
int n,k;
cin>>n>>k;
int i;
double l=0,r=0;
for(i=0;i<n;i++)
{
cin>>a[i].v>>a[i].w;
a[i].id=i+1;
r+=a[i].v;
}
for(i=0;i<50;i++)
{
double mid=(l+r)/2;
if(C(mid,k,n))
l=mid;
else
r=mid;
}
sort(b,b+k,cmp);
for(i=0;i<k;i++)
{
printf("%d%c",b[i].id,i==k-1?'\n':' ');
}
return 0;
}
K Best
Time Limit: 8000MS | Memory Limit: 65536K | |
Total Submissions: 7073 | Accepted: 1848 | |
Case Time Limit: 2000MS | Special Judge |
Demy has n jewels. Each of her jewels has some value vi and weight
wi.
Since her husband John got broke after recent financial crises, Demy has decided to sell some jewels. She has decided that she would keep
k best jewels for herself. She decided to keep such jewels that their specific value is as large as possible. That is, denote the specific value of some set of jewels
S = {i1, i2, …,
ik} as
.
Demy would like to select such k jewels that their specific value is maximal possible. Help her to do so.
Input
The first line of the input file contains n — the number of jewels Demy got, and
k — the number of jewels she would like to keep (1 ≤ k ≤ n ≤ 100 000).
The following n lines contain two integer numbers each — vi and
wi (0 ≤ vi ≤ 106, 1 ≤
wi ≤ 106, both the sum of all
vi and the sum of all
wi do not exceed 107).
Output
Output k numbers — the numbers of jewels Demy must keep. If there are several solutions, output any one.
Sample Input
3 2 1 1 1 2 1 3
Sample Output
1 2
Source
Northeastern Europe 2005, Northern Subregion
思路:选取k个最大化平均值的思路在我上一篇,这里不再赘述。在不断缩小区间的过程中,满足最后一个精度的前k个元素也就是结果。循环100次超时,循环50次6秒。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 100005
struct node
{
int v,w,id;
};
node a[MAXN];
struct node1
{
double value;
int id;
}b[MAXN];
bool operator<(node1 x,node1 y)
{
return x.value>y.value;
}
int C(double x,int k,int n)
{
int i;
for(i=0;i<n;i++)
{
b[i].value=a[i].v-x*a[i].w;
b[i].id=a[i].id;
}
sort(b,b+n);
double sum=0;
for(i=0;i<k;i++)
{
sum+=b[i].value;
}
return sum>=0;
}
int cmp(node1 x,node1 y)
{
return x.id<y.id;
}
int main()
{
// freopen("C:\\1.txt","r",stdin);
int n,k;
cin>>n>>k;
int i;
double l=0,r=0;
for(i=0;i<n;i++)
{
cin>>a[i].v>>a[i].w;
a[i].id=i+1;
r+=a[i].v;
}
for(i=0;i<50;i++)
{
double mid=(l+r)/2;
if(C(mid,k,n))
l=mid;
else
r=mid;
}
sort(b,b+k,cmp);
for(i=0;i<k;i++)
{
printf("%d%c",b[i].id,i==k-1?'\n':' ');
}
return 0;
}
相关文章推荐
- BestCoder Round #50 (div.2)(hdu 5364,hdu 5365,hdu 5366)
- 设计模式:12 外观模式
- Linux常用命令
- WEB服务配置
- BZOJ 3669 [Noi2014]魔法森林 LCT
- Linux常用的命令
- 做一个温婉/儒雅的女汉子程序媛
- 《Objective-C基础教程》第7章 深入了解Xcode
- Android JNI Lame编解码实现wav到MP3的转换
- 使用asyncsocket群聊
- 粒子滤波Matlab代码
- Kafka项目实战-用户日志上报实时统计之应用概述
- Android AIDL使用步骤
- 我学正则表达式(2)——{m,n},?,*,+
- oracle10g启动报错ora-00214
- Google推荐的图片加载库Glide介绍
- Handler防止内存泄露
- BZOJ 1030 [JSOI2007]文本生成器
- android开发 获取父控件的高宽
- 最小生成树算法