码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3111 K Best

时间:2016-09-01 22:45:36      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:

二分,排序,贪心。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-6;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{
    char c = getchar(); x = 0;while(!isdigit(c)) c = getchar();
    while(isdigit(c)) { x = x * 10 + c - 0; c = getchar();  }
}

const int maxn=100010;
struct X { int v,w;}s[maxn];
int n,k,ans[maxn];
struct XX {double num; int id;}t[maxn];
double Max;

bool cmp(XX a,XX b){ return a.num>b.num; }

bool check(double x)
{
    for(int i=1;i<=n;i++)
    {
        t[i].num=1.0*s[i].v-x*s[i].w;
        t[i].id=i;
    }
    sort(t+1,t+1+n,cmp);

    double sum=0;
    for(int i=1;i<=k;i++) sum=sum+t[i].num;
    
    if(sum+eps>=0) 
    {
        for(int i=1;i<=k;i++) ans[i]=t[i].id;
        return 1;
    }
    return 0;
}

int main()
{
    while(~scanf("%d%d",&n,&k))
    {
        for(int i=1;i<=n;i++)
            scanf("%d%d",&s[i].v,&s[i].w);

        double L=0.0,R=10000000.0;
        int t=50;
        while(t--)
        {
            double mid=(L+R)/2;
            if(check(mid)) L=mid;
            else R=mid;
        }

        for(int i=1;i<=k;i++)
        {
            printf("%d",ans[i]);
            if(i<k) printf(" "); else printf("\n");
        }
    }
    return 0;
}

 

POJ 3111 K Best

标签:

原文地址:http://www.cnblogs.com/zufezzt/p/5831586.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!