您的位置:首页 > 其它

51nod 1257 背包问题V3

2017-02-18 10:42 239 查看
这题目比较简单了,直接二分价值做,比较无脑,但是c++的比较好像有点问题,我直接比较才行,如果是带个变量进去就会炸,莫名其妙。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int n,k;
typedef long long ll;
const  int N=1e6;
const int inf=1e9;
struct node
{
int x,y;
double z;
}a
,b
;
ll x,y;
int c
;
bool cmp(node a,node b)
{
return a.z>b.z;
}
inline ll gcd(ll a,ll b)
{
if (a%b==0)return b;
else return gcd(b,a%b);
}
bool pd(double p)
{
fo(i,1,n)
a[i].z=a[i].y-a[i].x*p;
sort(a+1,a+n+1,cmp);
x=0,y=0;
double sum=0;
fo(i,1,k)
{
x+=a[i].y;
y+=a[i].x;
sum+=a[i].z;
}
if (sum>=0)return true;
else return false;
}
int main()
{
scanf("%d%d",&n,&k);
fo(i,1,n)
{
int x,y;
scanf("%d%d",&x,&y);
a[i].x=x;
a[i].y=y;
//a[i].z=y/x;
}
double l=0,r=50000;
ll ans1,ans2,lcm;
int eps=1e-5;
while (r-l>10E-6)
{
double mid=(l+r)/2;
if (pd(mid))
{
l=mid;
ans1=x,ans2=y;
}
else r=mid;
}
lcm=gcd(max(ans1,ans2),min(ans1,ans2));
ans1/=lcm;
ans2/=lcm;
printf("%lld/%lld\n",ans1,ans2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: