zoukankan      html  css  js  c++  java
  • HDU3177 Crixalis's Equipment 贪心

         该题给定一个容器的体积,以及N个物品,每个物品有其要求的最少空间以及实际所占的空间 。 要我们判断是否可以把所有的物品全部放在里面,当然如果能够放进去也是需要一定的顺序的。最好的放置方法就是每次将物品中所占空间与实际空间差值最大的首先放进去。

      现在我们来证明这个差值排序的正确性:

      先申明几个变量的符号: CUR_MAX_V  当前的最大体积 ; CUR_NULL_V  当前的空余的体积 ;T_MAX_V  当前物品的所需的体积 ;  T_REAL_V  当前物品的实际体积

    现在假设有一个无限大的空间,保证能够将所有的物品放入,考虑到当前的体积与即将放入的物品有如下关系:

                                                                        ( CUR_MAX_V )      (   T_MAX_V <=  CUR_NULL_V )

                              CUR_MAX_V=

                                                                        ( CUR_MAX_V )+ ( T_MAX_V )- ( CUR_NULL_V )      (  T_MAX_V >  CUR_NULL_V  )

      由上式可知,要想使得CUR_MAX_V 在放入所有物品的同时尽可能的小则要求  CUR_NULL_V  足够大,因此我们总是选择将差值最大的首先放入,如果在这种最优的条件下都无法使得物品全部放入,则一定不能完成放入任务。

    代码如下:

    #include <stdio.h>
    #include <stdlib.h>
    
    struct Node
    {
    	int p;
    	int v;
    	int dec;
    }N[1005];
    
    int cmp( const void *a, const void *b )
    {
    	struct Node *x= ( struct Node * )a, *y= ( struct Node * )b;
    	return y-> dec- x-> dec;
    }
    
    int main(  )
    {
    	int T;
    	scanf( "%d", &T );
    	while( T-- )
    	{
    		int ta, M, flag= 0;
    		scanf( "%d %d", &ta, &M );
    		for( int i= 0; i< M; ++i )
    		{
    			scanf( "%d %d", &N[i]. p, &N[i]. v );
    			N[i]. dec= N[i]. v- N[i]. p;
    		}
    		qsort( N, M, sizeof( N[0] ), cmp );
    		for( int i= 0; i< M; ++i )
    		{
    			if( ta>= N[i]. v )
    			{
    				ta-= ( N[i]. p);
    			}
    			else
    			{
    				flag= 1;
    				break;
    			}
    		}
    		printf( flag? "No\n": "Yes\n" );
    	}
    	return 0;
    }
    
  • 相关阅读:
    014Linux几种虚拟网络比较
    013Docker几种存储驱动比较(转发)
    005文件系统压测工具iozone
    016SNAT和DNAT区别
    012docker四种网络模式区别
    001CPU个数/物理核数/逻辑核数/vCPU数之间的区别
    009Ubuntu关闭掉终端或jet公司烦人的bell音
    Java 微信小程序imgSecCheck接口示例-校验一张图片是否含有违法违规内容
    提升NginxTLS/SSL HTTPS 性能的7条优化建议
    MySQL复合索引探究
  • 原文地址:https://www.cnblogs.com/Lyush/p/2109992.html
Copyright © 2011-2022 走看看