POJ-3111K Best

来源:互联网 发布:edius视频软件 编辑:程序博客网 时间:2024/05/19 20:47
有n个珠宝,价值为vi,重量为ni,保留m个,输出保留m个的珠宝,使其平均价值最大。


本想着用pair优化一下的。但就是WR,
也看不出自己的代码错在哪里....


WA代码

#include <iostream>#include <map>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <vector>#include <queue>#include <stack>#include <functional>#include <set>#include<sstream>#include <cmath>using namespace std;#define pb push_back#define PB pop_back#define bk back()#define fs first#define se second#define INF 1e9*2+10#define sq(x) (x)*(x)#define eps (1e-7)#define clr(x) memset((x),0,sizeof (x))#define cp(a,b) memcpy((a),(b),sizeof (b))const int maxn=100010;int n,k;pair<int,int> jew[maxn];pair<double,int> c[maxn];bool C(double m){    for(int i=0;i<n;i++)    {        c[i].se=i+1;        c[i].fs=jew[i].fs-m*jew[i].se;    }    sort(c,c+n);    double sum=0;    for(int i=n-1;i>=k;i--) sum+=c[i].fs;    return sum>0;}int main(){    cin>>n>>k;    for(int i=0;i<n;i++) cin>>jew[i].fs>>jew[i].se;    double left,right,mid;    left=0;    right=INF;    for(int i=0;i<50;i++)    {        mid=(left+right)/2;        if(C(mid)) left=mid;        else       right=mid;    }    for(int i=0;i<n;i++)    {        c[i].se=i+1;        c[i].fs=jew[i].fs-left*jew[i].se;    }    sort(c,c+n);    int flag=0;    for(int i=0;i<k;i++)    {        if(flag) cout<<" "<<c[i].se;        else        {                 cout<<c[i].se;                 flag=1;        }    }    cout<<endl;    return 0;}
AC代码;

#include <iostream>#include <map>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <vector>#include <queue>#include <stack>#include <functional>#include <set>#include<sstream>#include <cmath>using namespace std;#define pb push_back#define PB pop_back#define bk back()#define fs first#define se second#define INF 1e18+10#define sq(x) (x)*(x)#define eps (1e-10)#define clr(x) memset((x),0,sizeof (x))#define cp(a,b) memcpy((a),(b),sizeof (b))typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> P;const int maxn=100100;int n,k;struct node{    int w;    int v;}jew[maxn];struct Node{    double x;    int ID;    bool operator <(const Node a) const    {        return x>a.x;    }}num[maxn];bool c(double d){    for(int i=0;i<n;i++)    {        num[i].x=jew[i].v-d*jew[i].w;        num[i].ID=i+1;    }    sort(num,num+n);    double sum=0;    for(int i=0;i<k;i++) sum+=num[i].x;    return sum>0;}int main(){    scanf("%d%d",&n,&k);    for(int i=0;i<n;i++) scanf("%d%d",&jew[i].v,&jew[i].w);    double left,right,mid;    left=0;    right=1000000+10;    for(int i=0;i<50;i++)    {        mid=(left+right)/2;        if(c(mid)) left=mid;        else       right=mid;    }    int flag=0;    for(int i=0;i<n;i++)    {        num[i].x=jew[i].v-left*jew[i].w;        num[i].ID=i+1;    }    sort(num,num+n);    for(int i=0;i<k;i++)    {        if(flag) printf(" %d",num[i].ID);        else        {            printf("%d",num[i].ID);            flag=1;        }    }    printf("\n");    return 0;}



0 0
原创粉丝点击