1257 背包问题 V3

基准时间限制:3 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大。
Input
第1行:包括2个数N, K(1 <= K <= N <= 50000)
第2 - N + 1行:每行2个数Wi, Pi(1 <= Wi, Pi <= 50000)
Output
输出单位体积的价值(用约分后的分数表示)。
Input示例
3 2
2 2
5 3
2 1
Output示例
3/4

一道经典问题,在《挑战程序设计竞赛第2版》143页中有原题,最大化平均值。
刚开始我也是想 按照z=p/w 排序,但是这种贪心有问题的。
想到二分答案。
假设知道答案x
那么我们知到总价值要>=x*k; Sum(p[i])/Sum(w[i])>=x;
Sum只有K个
那么S
Sum(p[i]>=Sum(w[i】*x);
于是 每次求Sum(p[i]-w[i]*x)>=0;求totx,toty最大 难看的代码:
#include<bits/stdc++.h>

using namespace std;
typedef long long ll; #define N 211111
struct node
{
int w,p;
double c;
}a[N]; int cmp(node a,node b)
{
return a.c>b.c;
} int n,k;
ll gcd(ll x,ll y)
{
if (y==0) return x;
return gcd(y,x%y);
} ll ax,ay; int pan(double xx)
{
ll x,y;
x=y=0; for (int i=1;i<=n;i++)
a[i].c=1.0*a[i].p-xx*a[i].w; sort(a+1,a+n+1,cmp);
double sum=0;
for (int i=1;i<=k;i++)
{
sum+=a[i].c;
x+=a[i].p;
y+=a[i].w;
} if (sum>=0)
{
ax=x;
ay=y;
return 1;
}
return 0; } int main()
{
scanf("%d%d",&n,&k); for (int i=1;i<=n;i++)
scanf("%d%d",&a[i].w,&a[i].p);
double l=0,r=5000000000.0; for (int _=1;_<=100;_++)
{
double mid=(l+r)*0.5;
if (pan(mid)) l=mid;
else r=mid;
}
cout<<ax/gcd(ax,ay)<<"/"<<ay/gcd(ax,ay)<<endl;
return 0;
}

PS:做过的类型题,却忘记怎么解决.根本做了没有用。

的确要反思自己的学习方式了


51nod 1257 背包问题 V3的更多相关文章

  1. 51nod 1257 背包问题 V3(这不是背包问题是二分)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 题解:不能按照单位价值贪心,不然连样例都过不了 要求的 ...

  2. 51nod 1257 背包问题 V3(分数规划)

    显然是分数规划...主要是不会求分数的形式,看了题解发现自己好傻逼QAQ 还是二分L值算出d[]降序选K个,顺便记录选择时候的p之和与w之和就可以输出分数形式了... #include<iost ...

  3. 1257 背包问题 V3(二分)

    1257 背包问题 V3 3 秒 131,072 KB 80 分 5 级题 题意 : 从n个物品中选出k个,使单位体积价值最大 思路: 一开始正面想,试过很多种,排序什么的..总是结果不对,最后想到二 ...

  4. 1257 背包问题 V3——分数规划

    N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大. Input 第1 ...

  5. 51nod 1257 01分数规划/二分

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 1257 背包问题 V3 基准时间限制:3 秒 空间限制:1310 ...

  6. 51nod1257 背包问题 V3

    分数规划经典.开始精度1e-3/1e-4都不行,1e-5就A了 #include<cstdio> #include<cstring> #include<cctype> ...

  7. 51nod——1086、1257背包问题V2(多重背包二进制拆分转01) V3(分数规划+二分贪心)

    V3其实和dp关系不大,思想挂标题上了,丑陋的代码不想放了.

  8. 51Nod 最小公倍数之和V3

    这题公式真tm难推……为了这题费了我一个草稿本…… woc……在51Nod上码LaTeX码了两个多小时…… 一开始码完了前半段,刚码完后半段突然被51Nod吃了,重新码完后半段之后前半段又被吃了,吓得 ...

  9. 51nod 1086 背包问题 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1086 思路  裸的多重背包 巩固一下刚学的骚操作 #include< ...

随机推荐

  1. hdu 3804 树链剖分

    思路:将边权排序,然后插入线段树,这样就可以直接用二分查找确定答案. #pragma comment(linker, "/STACK:1024000000,1024000000") ...

  2. cmd 命令收集

    window类   1.命令打开系统设置页面 1.control keymgr.dll 打开凭据管理器 2.gpedit.msc 打开管理面板 3.mspaint--------画图板  4.msts ...

  3. lua技巧分享之保护执行

    我们在c#/c++里为了防止调用出现异常的时候程序可以正常的执行,经常使用try{}catch{}的结构, 那么,语言简单的lua是怎么做到的呢?答案就在pcall 先简单的介绍一下这个函数: --尝 ...

  4. MVC 上传图片的解决方案

    为了避免冲突,分两步来引用nuget第一步为项目安装nuget: Install-Package Backload Install-Package jQuery.FileUpload 分别引用,安装后 ...

  5. VxWorks 6.9 内核编程指导之读书笔记 -- ISRs和Watchdog Timer

    中断服务程序 ISR 硬件中断处理是实时系统的关键,因为它是外部时间通知系统的方式. ISR亦称为中断处理函数,是对中断的正确响应.可以使用任何ISR连接到任何没有被VxWorks使用的中断上.当关联 ...

  6. C# Winform里面用Console.WriteLine输出到哪了

    C# Winform里面用Console.WriteLine输出也不会报错 显示在 VS IDE 的视图→输出窗口,且只在 Debug 环境下此语句执行. 如果是 Release 环境,在 Win32 ...

  7. 解析Path方法备忘

    public static String parseDataPath(String dataPath){ StringBuilder parseBld = new StringBuilder(); L ...

  8. 10款很酷的HTML5动画和实用应用 有源码

    10款很酷的HTML5动画和实用应用,这里有菜单.SVG动画.Loading动画,总有你喜欢的,而且,每一款HTML5应用都提供源代码下载,方便大家学习和研究,一起来看看吧. 1.HTML5 SVG ...

  9. 项目中Service层的写法

    截取自项目中的一个service实现类,记录一下: base类 package com.bupt.auth.service.base; import javax.annotation.Resource ...

  10. J2EE5(Servlet2.5)对EL表达式的支持

    JAVA EE5默认 支持EL表达式. 办法一:在每个jsp文件的最上方加入以下代码: <%@ page language="java" import="java. ...