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); }
相关文章推荐
- 51Nod-1257-背包问题 V3
- 51nod 1257 背包问题 V3
- 51nod 1257 背包问题 V3(分数规划)
- [51nod] 1257 背包问题 V3
- 51nod 1257 背包问题 V3
- 51nod 1257 背包问题 V3(二分)
- 51 nod oj 1257 背包问题 V3【01分数规划】
- 1257 背包问题 V3——分数规划
- 51Nod 1085 背包问题
- 51nod 1086 背包问题V2(巧妙拆分多重背包)
- 51Nod 有限背包计数问题 题解报告
- 51nod 1086 背包问题 V2
- 51nod-0-1背包问题
- 51nod-【多重背包问题】
- 51Nod 1085 背包问题(01背包 )
- 51nod 1086 背包问题 V2(多重背包)
- 51NOD 背包问题v2(动态规划)
- 51nod-1086 背包问题(多重背包)
- 51Nod-1085-背包问题
- 51nod 1085 背包问题