标签:des style blog http color os io 数据
题意:要搬一些装备进入洞穴,洞的空间为V,他有N件装备,每件装备需要Ai的空间摆放,并且在把装备搬入洞穴的时候,需要Bi空间,某件装备摆放完毕后,洞穴内减少Ai的体积,问是否能把所有装备都搬入洞穴,可以输Yes,不可以输出No。
思路:
这题按Bi大小排序是不可以的。
比如一组数据中 V = 22
有2件装备A1 = 19 B1 = 21
A2 = 1 B2 = 20
那么如果按B的大小从大到小排序,则先搬第一件,再搬第二件,那么就无法把2件装备都搬入洞穴,而如果先搬第二件物品,搬完后洞穴剩余空间还有21,可以再搬第一件物品,就可以把2个装备全部搬入洞穴。
所以应该考虑瞬时最大体积。还是举原来这个例子,如果先搬第一件物品,再搬第二件物品,需要的瞬时空间最大为19+20 = 39,而先搬第二件物品再搬第一件物品,需要最大的瞬时空间为1+21 = 22。
所以要比较的是 A1 + B2 与 A2 + B1 的大小, 若A1 + B2 < A2 + B1
即 A1 - B1 < A2 - B2 则先搬第一个。所以按Ai - Bi排序即可。
#include <iostream> #include <cstring> #include <cstdio> #include <string> #include <algorithm> using namespace std; #define maxn 1010 int T, N, V; bool flag; struct Node{ int a, b; }node[maxn]; bool cmp(Node x, Node y){ return (x.a - x.b) < (y.a - y.b); } int main(){ scanf("%d", &T); while(T--){ scanf("%d%d", &V, &N); for(int i = 1; i <= N; i++){ scanf("%d%d", &node[i].a, &node[i].b); } sort(node+1, node+1+N, cmp); flag = true; for(int i = 1; i <= N; i++){ if(node[i].b <= V){ V -= node[i].a; } else{ flag = false; break; } } if(flag) printf("Yes\n"); else printf("No\n"); } return 0; }
hdu 3177 Crixalis's Equipment(贪心),布布扣,bubuko.com
hdu 3177 Crixalis's Equipment(贪心)
标签:des style blog http color os io 数据
原文地址:http://www.cnblogs.com/titicia/p/3879012.html