题目选自洛谷P2370

两种解法,01背包+排序,或是直接二分即可

写了二分最后只有40的分...刚好过了给的四个样例

哭辽~想了半天不知道哪里错了

题目背景

在 2020 年的某一天,我们的 yyy2015c01 买了个高端 U 盘。

题目描述

你找 yyy2015c01 借到了这个高端的 U 盘,拷贝一些重要资料,但是你发现这个 U 盘有一些问题:

  1. 这个 U 盘的传输接口很小,只能传输大小不超过 LL 的文件。
  2. 这个 U 盘容量很小,一共只能装不超过 SS 的文件。

但是你要备份的资料却有很多,你只能备份其中的一部分。

为了选择要备份哪些文件,你给所有文件设置了一个价值 V_iVi​,你希望备份的文件总价值不小于 pp。

但是很快你发现这是不可能的,因为 yyy2015c01 的传输接口太小了,你只有花钱买一个更大的接口(更大的接口意味着可以传输更大的文件,但是购买它会花费更多的钱)。

注意:你的文件不能被分割(你只能把一个文件整个的传输进去,并储存在U盘中),

你放在 U 盘中文件的总大小不能超过 U 盘容量。

现在问题来了:你想知道,在满足 U 盘中文件价值之和不小于 pp 时,最小需要多大的接口。

输入格式

第 11 行,三个正整数 n,p,Sn,p,S 分别表示文件总数,希望最小价值 pp ,硬盘大小。

接下来 nn 行,每行两个正整数 W_{i},V_{i}Wi​,Vi​,表示第 ii 个文件的大小和价值。

输出格式

输出一个正整数表示最小需要的接口大小。

如果无解输出 No Solution!

输入输出样例

输入 1

3 3 5
2 2
1 2
3 2

输出 1

2

输入 2

2 3 505
1 2
500 1

输出 2

500

输入 3

3 3 2
2 2
1 2
3 2

输出 3

No Solution!

输入4

4 5 6
5 1
5 2
5 3
1 1

输出 4

No Solution!

说明/提示

1≤n,Wi​,S≤10^3,1≤Vi​≤10^6,1≤p≤10^9。

数据较小,请勿乱搞。

样例解释 1:买一个大小为 2 接口,把物品 1 、2 放进U盘。

样例解释 2:买一个大小为 500 的接口。

样例解释 3:本来可以买大小为 2 的接口,可是 U 盘容量放不下足够的文件。

解题代码: (01背包+排序)

#include<cstdio>
#include<algorithm>
using namespace std;
int n,p,s;
int dp[1005];//dp[i]表示装i体积的东西能够得到的价值
struct node
{int v,w;
}a[1005];//在这里定义一个结构体,因为后面要用到排序
int cmp(node a,node b)
{return a.v<b.v;//简单的排序 }
int main()
{scanf("%d%d%d",&n,&p,&s);//输入对应的文件总数,希望最小价值p和硬盘大小s for(int i=1;i<=n;i++)scanf("%d%d",&a[i].v,&a[i].w);sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++)for(int j=s;j>=a[i].v;j--)//01背包的模板 {dp[j]=max(dp[j],dp[j-a[i].v]+a[i].w);if(dp[s]>=p)//如果此时装满的情况下得到的价值已经超过了所需,//那么当前物品的体积就是满足条件的最小体积(因为之前已经排过序了) {printf("%d",a[i].v);//直接输出,结束程序 return 0;}}printf("No Solution!");    //输出不满足条件的情况
}

未AC代码:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n,p,s;  //n个文件 p最小期望价值和 s为U盘容量
struct node{int w,v;
}doc[1010];
bool cmp(node a,node b){//因为我们二分的过程是根据接口的大小来查找,所以先排体积//根据文件的体积从小到大排序if(a.w != b.w) return a.w < b.w;return a.v > b.v;//体积相同的价值大的优先
}
bool judge(int a){  //二分条件满足的判断函数int value = 0; //保存总价值int tj = 0; //保存体积for(int i=0;i<n&&doc[i].w<=a;i++){if(tj > s || value >= p) break; //如果体积已经超过了预定的接口大小value += doc[i].v;tj += doc[i].w;}if(value >= p && tj <= s) return true;return false;
}
int main(){cin>>n>>p>>s;int Min=0x3fffffff,Max=-1; //记录一下文件大小的最值,进行特判for(int i=0;i<n;i++){//输入文件的 大小、价值scanf("%d%d",&doc[i].w,&doc[i].v);if(Min > doc[i].w) Min = doc[i].w;if(Max < doc[i].w) Max = doc[i].w;}if(Min > s){  //最小的文件都比U盘大printf("No Solution!\n");return 0;}sort(doc,doc+n,cmp);int l=Min,r=Max+100;int ans = -1;while(l<=r){int mid = l+(r-l)/2;if(judge(mid)){ans = mid; r = mid - 1; //这样可以,尝试更小的方法}else{l = mid + 1;}}if(ans != -1) printf("%d",ans);else printf("No Solution!");return 0;
}

二分答案——yyy2015c01 的 U 盘(洛谷 P2370)相关推荐

  1. 二分答案——数列分段 Section II(洛谷 P1182)

    题目选自洛谷P1182 本题解法:二分答案+贪心 思路:首先,分析题目,求最大值的最小化,直接联想到二分,So我们直接二分答案,关键是要怎么去高效的check,我们考虑一个贪心的思路,能加的就加上,不 ...

  2. 二分答案——烦恼的高考志愿(洛谷 P1678)

    题目选自洛谷P1678 如果仅仅是套循环的话显然在数据比较大的情况下是不够优化 的,所以我们可以先把得到的分数线排序再二分操作. 这道题二分的原理很简单,因为我们求的是某一个学生和某一个分数线最小的差 ...

  3. 二分查找例题(二)洛谷P1163

    题目来自洛谷P1163 题目描述 /**月利率=年利率/12 利滚利**/ #include <iostream> using namespace std; int main() {dou ...

  4. 洛谷P2370 yyy2015c01的U盘

    点击跳转了解题意 题解:分析一下这道题,发现价值并不是最重要的(因为只要过p就可以嘛),重要的是,最小的接口. 所以应用贪心策略,我们应该优先装接口(大小)小的,然后每次装完判断一下,当前价值是否超过 ...

  5. 洛谷--橙色百道DP总结

    最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...

  6. 洛谷 P8552 Rabbit

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P8552 Rabbit 题目 题目背景 "说实话,最喜欢你了:因为长得好看,所以最喜欢你了. 你的性格,我最喜欢了:虽然不 ...

  7. 洛谷P1182 数列分段Section II 二分答案

    洛谷P1182 数列分段Section II 二分答案 题意:将 n 个 数 分为 m段 求一种方案,使这m段中最大的和 最小 额..可能有点拗口,其实就是说每一种方案,都有对应的 每段和的最大值, ...

  8. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  9. 二分答案——跳石头(洛谷 P2678)

    题目选自洛谷P2678 这道题题目并不复杂,思考一下也能知道用二分的方法来做. 难点在于如何判断是否满足条件,以及二分的边界问题. 下面给出详细解题思路: //tot表示需要搬走的石块数量,i表示找的 ...

最新文章

  1. 注册窗口类RegisterClassEx   AfxRegisterWndClass
  2. 一些蠕虫传播研究的文章——TODO
  3. 201521123011 《java程序设计》 第9周学习总结
  4. Java8之lambda表达式的总结
  5. 如何选择适合自己公司的移动办公系统?
  6. C++11:move移动语义
  7. php 其他页面获取session_PHP五十个提升执行效率的小技巧,和常见问题
  8. cookie与session的比较
  9. Java入门系列-24-实现网络通信
  10. java线程学习笔记
  11. mybatis系列-03-入门程序
  12. CSS 左中右三列布局5种方式
  13. python做淘宝客_python 做淘宝客程序(2)
  14. 推荐几个免费的ppt模板网站
  15. CSS里的 no-repeat 是什么意思
  16. UG\NX二次开发 判断面的凹凸、圆柱还是孔、外R角还是内R角。三种方案
  17. 简单对象协议(SOAP)简介
  18. 使用rrdtool统计网站PV和IP
  19. php中seq是什么意思,seq-answer
  20. 大数据对于旅游业意味着更大的挑战

热门文章

  1. 自己动手清除电脑中的***程序
  2. asp.net取消页面表单内文本输入框的Enter响应
  3. 由“美图秀秀”软件的网站,看网站的生存模式
  4. Linux中安装.rpm、.tar和.tar.gz或.tgz包
  5. 叮叮叮~~~~网络面试题(一)来了☺
  6. python里面的工厂模式
  7. IDEA下maven工程找不到@Test
  8. 使用projectx / os和Raspberry Pi托管您自己的电子邮件
  9. emacs扩展功能_3个用于组织的Emacs扩展
  10. 书呆子rico_来自书呆子总书呆子的6条阅读建议