zoukankan      html  css  js  c++  java
  • Hdu 3177 (贪心)

    题目大意:
    山洞的体积为(v)
    (i)个物品放在山洞里会占据(a_i)的空间,在搬运过程中至少需要(b_i)的空间
    问能不能把所有物品都放下

    贪心题.比较难看出贪心,但是从无顺序要求中可以看出这是个贪心.
    仍然考虑两个人.(贪心的基本操作)
    如果不知道为什么考虑两个人可以参考我的另外两篇有关贪心交换的好题:国王游戏
    皇后游戏
    设第一个人的占据空间为(a_1),需要空间为(b_1)
    然后就可以乱搞分析.
    仍然的.
    所用的空间.
    max(max(b_1,a_1+b_2),max(b_2,a_2+b_1))是不能排在第一位的
    首先(b_1,b_2)是不可能作为答案的.
    (a_1+b_2 a_2+b_1)
    两边同时减去(b_1+b_2)
    成了
    (a_1-b_1,a_2-b1)
    如果(a_1-b_1 > a_2-b1)就让第一个人排在第一个位置.
    反之同理.

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    const int maxN = 1000 + 7;
    
    struct Node{
    	int a,b;
    }Q[maxN];
    int T,n,V;
    bool operator < (const Node &a,const Node &p) {
    	return a.a - a.b < p.a - p.b;
    } 
    
    bool cmp(int sum,int id) {
    	if(sum + Q[id].b > V) return false;
    	return true;
    }
    
    int main() {
    	scanf("%d",&T);
    	while(T --) {
    		scanf("%d%d",&V,&n);
    		for(int i = 1;i <= n;++ i) 
    			scanf("%d%d",&Q[i].a,&Q[i].b);
    		std::sort(Q + 1,Q + n + 1);
    		int sum = 0;
    		bool flag = true;
    		for(int i = 1;i <= n;++ i) {
    			if(cmp(sum,i)) sum += Q[i].a;
    			else {
    				flag = false;
    				break;
    			}
    		}
    		flag ? puts("Yes") : puts("No");
    	}
    	return 0;
    }
    
  • 相关阅读:
    1
    Dockerfile概述
    协议
    部署环境
    协议与数据2
    【笔记】刚到公司,初识dll
    C#Winform学习笔记
    VS2019添加VisionPro控件(此方法是大师分享的)
    VisionPro脚本
    Visionpro相机取像操作,.NET4.0
  • 原文地址:https://www.cnblogs.com/tpgzy/p/9524836.html
Copyright © 2011-2022 走看看