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

ps:blocks[i].w物体的价值 block[i].p物体的体积 p二分答案
假设p是我们要的答案,那么block[i].p*p为block[i]应该占有的价值
blocks[i].w - block[i].p * p 为现在与目标价值的差
这个差约小说明越接近答案,根据这一位进行排序,只要前k个。记录当前总体积和总价值即可。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
static int n, k;
static int ansA = 0, tA = 0;
static int ansB = 0, tB = 0;
static Block[] blocks = null;
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
n = cin.nextInt();
k = cin.nextInt();
blocks = new Block[n];
for (int i = 0; i < n; i++) {
int a = cin.nextInt();
int b = cin.nextInt();
blocks[i] = new Block(a, b, 0);
}
cin.close();
double left = 0, right = 50000.0;
for (int i = 1; i < 100; i++) {
double mid = (left + right) / 2.0;
if (check(mid)) {
ansA = tA;ansB = tB;tA = tB = 0;
left = mid;
} else {
ansA = tA;ansB = tB;tA = tB = 0;
right = mid;
}
}
int x = gcd(ansA, ansB);
System.out.println(ansB / x + "/" + ansA / x);
}
public static boolean check(double p) {
for (int i = 0; i < n; i++) {
blocks[i].dis = 1.0 * blocks[i].w - blocks[i].p * p;
}
Arrays.sort(blocks);
double sum = 0;
for (int i = 0; i < k; i++) {
tA += blocks[i].w;
tB += blocks[i].p;
sum += blocks[i].dis;
}
if (sum > 0) return true;
return false;
}
static int gcd(int a, int b) {
return b == 0 ? a : gcd(b, a % b);
}
static class Block implements Comparable<Block> {
int w;
int p;
double dis;
public Block(int w, int p, double dis) {
this.w = w;
this.p = p;
this.dis = dis;
}
@Override
public int compareTo(Block o) {
if (dis > o.dis) return 1;
return -1;
}
}
}
1257 背包问题 V3(二分)的更多相关文章
- 51nod 1257 背包问题 V3
1257 背包问题 V3 基准时间限制:3 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2.. ...
- 51nod 1257 背包问题 V3(这不是背包问题是二分)
题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 题解:不能按照单位价值贪心,不然连样例都过不了 要求的 ...
- 51nod 1257 背包问题 V3(分数规划)
显然是分数规划...主要是不会求分数的形式,看了题解发现自己好傻逼QAQ 还是二分L值算出d[]降序选K个,顺便记录选择时候的p之和与w之和就可以输出分数形式了... #include<iost ...
- 1257 背包问题 V3——分数规划
N个物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数),从中选出K件物品(K <= N),使得单位体积的价值最大. Input 第1 ...
- 51nod1257 背包问题 V3
分数规划经典.开始精度1e-3/1e-4都不行,1e-5就A了 #include<cstdio> #include<cstring> #include<cctype> ...
- 51nod——1086、1257背包问题V2(多重背包二进制拆分转01) V3(分数规划+二分贪心)
V3其实和dp关系不大,思想挂标题上了,丑陋的代码不想放了.
- 51nod 1257 01分数规划/二分
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1257 1257 背包问题 V3 基准时间限制:3 秒 空间限制:1310 ...
- hdu 1025LIS思路同1257 二分求LIS
题目: Constructing Roads In JGShining's Kingdom Time Limit: 2000/1000 MS (Java/Others) Memory Limit ...
- CSU OJ PID=1514: Packs 超大背包问题,折半枚举+二分查找。
1514: Packs Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 61 Solved: 4[Submit][Status][Web Board] ...
随机推荐
- Ocelot(八)- Ocelot不支持的几个方面
不支持 Ocelot不支持的几个方面 Chunked Encoding - Ocelot将始终获取正文大小并返回Content-Length标头.很抱歉,如果这对您的用例不起作用! 转发主机标头 - ...
- NOIp2013 车站分级 【拓扑排序】By cellur925
题目传送门 我们注意到,题目中说:如果这趟车次停靠了火车站 x,则始发站.终点站之间所有级别大于等于火车站x的都必须停靠.有阶级关系,满满的拓扑排序氛围.但是,如果我们按大于等于的关系连,等于的情况就 ...
- python之计数统计
前言: 计数统计,简单的说就是统计某一项出现的次数.实际应用中很多需求都需要用到这个模型,如检测样本中某一值出现的次数.日志分析某一消息出现的频率.分析文件中相同字符串出现的概率等等.以下是实现的不同 ...
- 进击的Python【第七章】:python各种类,反射,异常处理和socket基础
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- mysql主从同步异常原因及恢复
mysql主从同步异常原因及恢复 前言 mysql数据库做主从复制,不仅可以为数据库的数据做实时备份,保证数据的完整性,还能做为读写分离,提升数据库的整体性能.但是,mysql主从复制经常会因为某些原 ...
- [POI2009]石子游戏Kam
Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏 ...
- python 字符串的split()函数详解(转)
作者:宋桓公 出处:http://www.cnblogs.com/douzi2/ 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同 ...
- [转]在ASP.NET MVC3中使用EFCodeFirst 1.0
本文转自:http://kb.cnblogs.com/page/97003/ 作者: NinoFocus 来源: 博客园 发布时间: 2011-04-12 10:41 阅读: 11971 次 ...
- 11.2Java-多态
一.父类 public class Fu { public void show(){ System.out.println("父类"); } } 二.子类 public class ...
- 使用 Java 发送邮件
在我们的应用程序中有时需要给用户发送邮件,例如激活邮件.通知邮件等等.那么如何使用 Java 来给用户发送邮件呢? 使用 java 代码发送邮件 使用工具类发送邮件 使用Spring进行整合发送邮件 ...