【NOIP2017提高A组模拟9.5】NYG的背包

2024-05-29 02:58

本文主要是介绍【NOIP2017提高A组模拟9.5】NYG的背包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description

这里写图片描述

Input

这里写图片描述

Output

这里写图片描述

Sample Input

输入1:
3 5
3 1
4 8
8 3

输入2:
3
7 9269
21366 1233
7178 23155
16679 23729
15062 28427
939 6782
24224 9306
22778 13606
5 22367
17444 5442
16452 30236
14893 24220
31511 13634
4380 29422
7 18700
25935 4589
24962 9571
26897 14982
20822 2380
21103 12648
32006 22912
23367 20674

Sample Output

输出1:
Yes

输出2:
Yes
Yes
No

Solution

各种奇奇怪怪的贪心都能拿很高分
首先对于会使背包变大的直接加入即可
对于剩下的呢?
题解的方法是按照b排序,从小到大加入
就是假设为yes那么放入等于删除,然后就-b+a,然后就和第一种情况一样了,因为第一种情况是-a+b,结果为正数,这个-b+a结果为正数

我的做法不太一样
大概是:
对于每种物品,它对m的贡献是-a+b,一个负数
而最后一个放入背包的物品的贡献是-a
如果m去掉了所有物品的贡献,仍然大于等于0,说明是yes
那么最后一个就一定是b最小的一个,因为我要使贡献减小的尽可能少,最后一个相比其他多减了一个b,那么选最小的b,减少的就最小
正确性好像是对的吧
(如果不正确欢迎大神打脸)

Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define N 50100
#define ll long long
using namespace std;
int n;
struct node{ll x,y;
}a[N],b[N];
ll m;
bool cnt(node x,node y){return x.x<y.x;}
bool cmt(node x,node y){return x.y>y.y;}
int main()
{freopen("backpack.in","r",stdin);freopen("backpack.out","w",stdout);int ac;scanf("%d",&ac);for(;ac;ac--){scanf("%d%lld",&n,&m);int t1=0,t2=0;fo(i,1,n){ll x,y;scanf("%lld%lld",&x,&y);if(x<=y) a[++t1].x=x,a[t1].y=y;else b[++t2].x=x,b[t2].y=y;}sort(a+1,a+t1+1,cnt);bool bz=1;fo(i,1,t1) if(m>a[i].x) m=m-a[i].x+a[i].y;else bz=0;if(bz==0) {printf("No\n");continue;}sort(b+1,b+t2+1,cnt);ll jy=0;fo(i,1,t2) jy=jy-b[i].y+b[i].x;if(m>=jy) printf("Yes\n");else printf("No\n");}
}

这篇关于【NOIP2017提高A组模拟9.5】NYG的背包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1012456

相关文章

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu(背包的变形题)

题目链接 这是一道背包的变形题目。好题呀 题意:给n个怪物,m个人,每个人的魔法消耗和魔法伤害不同,求打死所有怪物所需的魔法 #include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>//#include<u>#include<map

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

hdu 2602 and poj 3624(01背包)

01背包的模板题。 hdu2602代码: #include<stdio.h>#include<string.h>const int MaxN = 1001;int max(int a, int b){return a > b ? a : b;}int w[MaxN];int v[MaxN];int dp[MaxN];int main(){int T;int N, V;s

uva 10130 简单背包

题意: 背包和 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>

HDU 2159 二维完全背包

FATE 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能