`
only_xxp
  • 浏览: 14010 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

pku1017

阅读更多

pku 1017   http://poj.org/problem?id=1017  解答过程

 

 

下面是最傻的方法, 逐一处理6*6    5*5     4*4  ...     进行详细而繁杂的讨论

 

#include<iostream>
using namespace std;

int main(){
	int p1, p2, p3, p4, p5, p6;
	int count = 0;
	while(1){
		cin>>p1>>p2>>p3>>p4>>p5>>p6;
		if(p1 == 0 && p2 == 0 && p3 == 0 && p4 == 0 && p5 == 0 && p6 == 0 ){
			break;
		}
		count = 0;
		//求cout
		int num2, num1;
		count += p6;					//处理6*6
		p6 = 0;
		while(p5 > 0){					//处理5*5
			p5 --;
			count ++;
			num1 = 11;
			while(p1 > 0 && num1 > 0){
				p1 --;
				num1 --;
			}
		}
		while(p4 > 0){					//处理4*4
			p4 --;
			count ++;
			int num2 = 5; //temp4表示还可以放5个2
			while(p2 > 0 && num2 > 0){
				p2 --;
				num2 --;
			}
			while(num2 > 0 && p1 > 0){
				num2 --;
				p1 --;
				p1 --;
			}
		}
		if(p3 > 0){						//处理3*3
			count += p3 / 4;
			p3 = p3 % 4; //还剩下的3*3的个数
			if(p3 != 0){
				count ++;//把剩下的3*3装入一个包裹里面, 再处理剩下的空位
				if(p3 == 1){
					num2 = 5; 
					while(p2 > 0 && num2 >0){
						p2 --;
						num2 --;
					}
					num1 = 7 + num2 * 2;
					while(p1 > 0 && num1 > 0){
						p1 --;
						num1 --;
					}
				}
				if(p3 == 2){
					num2 = 3; 
					while(p2 > 0 && num2 >0){
						p2 --;
						num2 --;
					}
					num1 = 6 + num2 * 2;
					while(p1 > 0 && num1 > 0){
						p1 --;
						num1 --;
					}
				}
				if(p3 == 3){
					num2 = 1; 
					while(p2 > 0 && num2 >0){
						p2 --;
						num2 --;
					}
					num1 = 5 + num2 * 2;
					while(p1 > 0 && num1 > 0){
						p1 --;
						num1 --;
					}
				}
			}
		}//end处理3*3
		if(p2 > 0){						//处理2*2
			count += p2 / 9;
			p2 = p2 % 9; //还剩下的2*2的个数
			if(p2 != 0){
				count ++;
				num1 = (9 - p2) * 4;
				while(p1 > 0 && num1 > 0){
					p1 --;
					num1 --;
				}
			}
		}//end处理2*2
		if(p1 > 0){						//处理1*1
			count += p1 / 36;
			if(p1 % 36 != 0)
				count ++;
		}
		cout<<count<<endl;
		
	}
	system("pause");
	return 0;
}
 

 

上面的方法太复杂, 讨论的方向过多, 很容易出错

 

 

 

如果加入更多的数学分析, 可以得出更简单的算法, 因为其中很多while是可以直接算出来的

 

#include<iostream>
using namespace std;

int main(){
	int p1, p2, p3, p4, p5, p6;
	int count = 0, num1 = 0, num2 = 0;//count为所需要的包裹的总数  num1和num2为余下的1*1 和2*2的空位
	int left2[4] = {0, 5, 3, 1};//4个值分别对应3*3的个数对4求余后, 还余下的2*2的空位
	while(1){
		cin>>p1>>p2>>p3>>p4>>p5>>p6;
		if(p1 == 0 && p2 == 0 && p3 == 0 && p4 == 0 && p5 == 0 && p6 == 0 ){
			break;
		}	
		count = p4 + p5 + p6; //每个4*4 和5*5 、6*6 都会占一个包裹
		count += (p3 + 3) / 4;//3*3会占的包裹数,  加3是为了向上取整
		num2 = p4 * 5 + left2[(p3 % 4)]; //剩余的2*2的空位为每个装4*4的包裹中余下的5个, 以及3*3对4求余后的3*3所装的一个包裹中余下的
		if(p2 > num2){//还有2*2没有装入包裹
			count += (p2 - num2 + 8) / 9;//为2*2单独新开的包裹数
		}
		num1 = count * 36 - (p6 * 36 + p5 * 25 + p4 * 16 + p3 * 9 + p2 * 4);//用所有包裹的总体积 减去 p2~p6所占总体积, 求得1*1空位  
		if(p1 > num1){//还有1*1没有装入包裹
			count += (p1 - num1 + 35) / 36;
		}
		cout<<count<<endl;
	}
	return 0;
}
 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    pku.zip_PKU

    【标题】"pku.zip_PKU" 指的是一份与北京大学(Peking University, PKU)相关的压缩文件。从描述来看,这份压缩包包含了部分编程题目的代码,可能是学生或者爱好者在解决北京大学编程竞赛或课程作业时编写的。"pku"这...

    pku经典题目解题报告

    "pku经典题目解题报告"这一标题揭示了文件内容的核心,它表明这是一份关于北京大学(PKU)编程竞赛或算法竞赛中的经典问题的解答集。通常,这样的报告会涵盖一系列在PKU历年比赛中出现的难题,包含了解题思路、算法...

    pku1000程序 解题报告

    pku1000 pku1000程序 解题报告

    PKU-ACM.rar_PKU_acm 题目

    在编程竞赛的世界里,北京大学(PKU)的ACM团队以其高质量的题目和独特的解题思路闻名。"PKU-ACM.rar"这个压缩包包含了北大ACM题目的一些核心知识点,旨在帮助参赛者理解和掌握算法竞赛中的生命周期题目解法。本文将...

    用于人体动作识别的PKU-MMD大范围数据集

    benchmark (PKU-MMD) for continuous multi-modality 3D human action understanding and cover a wide range of complex human activities with well annotated information. PKU-MMD contains 1076 long video ...

    ACM代码 之pku代码

    【标题】"ACM代码 之pku代码" 涉及的是在计算机科学领域中的算法竞赛编程,尤其是北京大学(Peking University, PKU)的ACM/ICPC(国际大学生程序设计竞赛)训练代码。这些代码是参赛者或教练为了准备这类竞赛而编写的,...

    pku acm 一些代码

    标题 "pku acm 一些代码" 暗示了这是一个与北京大学(Peking University, 简称PKU)的ACM(国际大学生程序设计竞赛)相关的代码集合。在这个领域,参赛者通常需要解决算法问题,编写高效且优化的代码来求解数学、逻辑...

    pku1664

    标题"Pku1664"很可能是指北京大学(Peking University)在某个编程竞赛或课程中的一道题目或项目,编号为1664。这道题目可能涉及到计算机科学的基础概念,尤其是算法和数据结构。描述中提到的是"Pku1664源代码",暗示...

    8数码代码pku1077

    8数码代码pku1077,300ms(哈希+广度搜索)

    pku1742.rar_pku 17_pku 1742 _报告及程序

    标题中的“pku1742.rar_pku 17_pku 1742 _报告及程序”表明这是一个与北京大学(Peking University, 简称PKU)相关的项目,项目编号可能是1742,内容包括了结题报告和程序代码。这个压缩包很可能是学生或研究人员提交...

    ACM.rar_PKU_acm pku_pku 1709 crossword_pku acm_visual c

    标签部分进一步细化了内容:"pku acm_pku"再次强调这是北京大学ACM竞赛的资料,"pku__1709__crossword"可能是特定的题目标签,而"pku_acm"可能是北京大学ACM团队的标识。"visual_c"可能表示这些代码是使用C++语言,...

    acm_pku_code.zip_Code p_acm pku_acm pku pu_acm.pku_pku acm

    "p_acm"、"pku_acm"以及"pu_acm.pku_pku"等标签可能是用于分类或标识这些代码属于北京大学(Peking University, PKU)的ACM训练题目。"acm"一词重复出现,进一步强调了这是关于ACM编程竞赛的内容。 描述中提到"acmer...

    PKU 2339 Rock, Scissors, Paper

    PKU 2339 Rock, Scissors, Paper 源代码

    pku1088.rar_pku 10_pku 1088_poj 1088

    标题中的“pku1088.rar_pku 10_pku 1088_poj 1088”指的是北京大学(Peking University, PKU)编程竞赛中的第1088题,也称为POJ(Peking University Online Judge)的1088题。这个题目在编程竞赛社区中通常有一个特定的...

    pku acm 1469 COURSES 代码

    pku acm 1469 COURSES 代码 二分图的最大匹配的匈牙利算法 解题报告请访问:http://blog.csdn.net/china8848

    pku_training.utf8

    分词训练用的pku训练集,主要是说明相似度计算的样例数据。

    pku2371c++标程

    北京大学pku2317 Questions and answers c++标程 文件名为2371.cpp

    pku离线题库

    北京大学(PKU)作为国内顶尖的学府,其提供的“pku离线题库”就是这样的一个宝贵资源,它不仅支持离线使用,还允许用户在没有网络时仍然能够有效地进行题目的查阅与练习。 “pku离线题库”这个资源的设计初衷,...

Global site tag (gtag.js) - Google Analytics