1004 Packets

一道贪心题,思路好想,不过细节有点多

自行百度题解

附上一个dalao代码

#include<stdio.h>
int main()
{
	int n,a,b,c,d,e,f,x,y;
	int u[4]={0,5,3,1};
	while(1)
	{
		scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);
		if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0)
			break;
		n=d+e+f+(c+3)/4;//懂了
		y=5*d+u[c%4];//在已有n个的情况下,能装下y个2*2的
		if(b>y)
			n+=(b-y+8)/9;//把多的2*2的弄进来
		x=36*n-36*f-25*e-16*d-9*c-4*b;
		if(a>x)
			n+=(a-x+35)/36;//把1*1的弄进来
		printf("%d\n",n);
	}
	return 0;
}

在附上我的辣鸡代码以作比较,有很多没有的代码,但是这些没用的代码让思路更清晰

#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<algorithm>
#include<queue>
#include<ctime>
#include<cstring>
#include<stdlib.h>
#include<map>
using namespace std;
int size[7],num,scrap[7],cost,go,i;
void cut(int x)
{
	if(x == 2)
	{
		if(size[2] > scrap[2]) 
		{		
			size[2] -= scrap[2];
			scrap[2] = 0;
		}
		else 
		{
			scrap[2] -= size[2];
			size[2] = 0;
			scrap[1] += scrap[2]*4;
			scrap[2] = 0;                              
			cut(1);
		}
		return ;                   //1. 防止运行上面代码后,x恰好变为1
	}
	if(x == 1)
	{
		if(size[1] > scrap[1])
		{
			size[1] -= scrap[1];
			scrap[1] = 0;
		}
		else 
		{	
			scrap[1] -= size[1];
			size[1] = 0;
		}
	}
}
int main()
{
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	while(1)
	{
		num = 0;
		go = 0;
		memset(scrap,0,sizeof(scrap));
		for(i = 1;i <= 6;i ++)
		{
			scanf("%d",&size[i]);
			if(size[i] != 0) go = 1;
		}
		if(!go) break;
		
		num += size[6];
		size[6] = 0;
		
		num += size[5];
		scrap[1] += size[5]*11;
		cut(1);
		size[5] = 0;
		
		num += size[4];
		scrap[2] += size[4]*5;
		cut(2);
		size[4] = 0;
		
		num += size[3]/4;
		size[3] %= 4;
		if(size[3]) num ++;
		if(size[3] == 1)
		{
			scrap[2] = 5;
			scrap[1] = 7;
			cut(2);
		}
		if(size[3] == 2)
		{
			scrap[2] = 3;
			scrap[1] = 6;
			cut(2);
		}
		if(size[3] == 3)
		{
			scrap[2] = 1;
			scrap[1] = 5;               //4.   数错数了.....数成了4
			cut(2);
		}
		size[3] = 0;
		
		num += size[2]/9;
		size[2] %= 9;
		if(size[2]) 
		{
			num ++;
			scrap[1] += (9-size[2])*4;    //3.这个必须在size[2]!=0 的前提下
		}
		cut(1);
		size[2] = 0;
		
		num += size[1]/36;      
		size[1] %= 36;                //2.zz一般的忘了处理size
		if(size[1]) num ++;
		
		printf("%d\n",num);
	}
	//fclose(stdin);fclose(stdout);
	return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_30358129/article/details/76302120
今日推荐