poj1017--贪心算法

用贪心算法,先从大的开始装~~测试数据参考:http://blog.sina.com.cn/s/blog_7b7c7c5f0100srtp.html


/*Problem: 1017 
Memory: 156K  Time: 16MS 
Language: C++  Result: Accepted */


#include<stdio.h>
#include<string.h>
#include<algorithm>


int main()
{
	int num[6];//保存输入
	int rest_5_1, rest_4_2, rest_3_1, rest_3_2, rest_2_1, rest1;
	int count;

	while(1)
	{
		scanf("%d %d %d %d %d %d", &num[0], &num[1], &num[2], &num[3], &num[4], &num[5]);
		if((num[0]+num[1]+num[2]+num[3]+num[4]+num[5]) == 0)
			break;

		rest_5_1 = 0;
		rest_4_2 = 0;
		rest_3_1 = 0;
		rest_3_2 = 0;
		rest_2_1 = 0;
		rest1 = 0;
		count = num[5];//size为6的产品独占一个箱子
		
		if(num[4] != 0)//处理size为5的,放了一个size为5的之后就只能放size为1的了(最多能放11个size为1的)
		{
			count += num[4];

			rest_5_1 = num[4]*11;
		}

		if(num[3] != 0)//处理size为4的
		{
			count += num[3];

			rest_4_2 = num[3]*5;
		}

		if(num[2] != 0)//处理size为3的,有一个size为3的就要加一个箱子,大于4个小于等于8个就要加两个
		{
			if(num[2]%4 != 0)
			{
				count += num[2]/4+1;
				if(num[2]%4 == 1)
				{
					rest_3_2 = 5;
					rest_3_1 = 7;
				}
				if(num[2]%4 == 2)
				{
					rest_3_2 = 3;
					rest_3_1 = 6;
				}
				if(num[2]%4 == 3)
				{
					rest_3_2 = 1;
					rest_3_1 = 5;
				}
			}
			else
			{
				count += num[2]/4;
				rest_3_2 = 0;
				rest_3_1 =0;
			}
		}
		if(num[1] > (rest_4_2+rest_3_2))//需要新的空箱子
		{
			if((num[1]-(rest_4_2+rest_3_2))%9 !=0)//每一个空箱子可以装9个size为2的产品
			{
				count += (num[1]-(rest_4_2+rest_3_2))/9+1;
				rest_2_1 = 36 - ((num[1]-(rest_4_2+rest_3_2))%9)*4;
			}
			else
			{
				count += (num[1]-(rest_4_2+rest_3_2))/9;
				rest_2_1 = 0;
			}
		}
		else//不需要新的空箱子
		{
			rest_2_1 = (rest_4_2+rest_3_2-num[1])*4;//装完2之后还剩下的可以装2的空降转为装1的空间
		}
		rest1 = rest_5_1+rest_3_1+rest_2_1;
		if(num[0] > rest1)
		{
			if((num[0]-rest1)%36 != 0)
				count += (num[0]-rest1)/36+1;
			else
				count += (num[0]-rest1)/36;
		}
		printf("%d\n", count);
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章