考察多判。
遍历所有组合,取出最好组合。
上代码。
#include <iostream> #include <map> #include <cstring> #include <algorithm> using namespace std; int arrStampType[256]; int arrCustomer[256]; int arrAnswer[7]; // 0数据长度 1种类 6tie? void showInput(); void cal(); void calRequest(int iRequest); void judgeBetter(int i, int j, int k, int l); int main () { int iVal; while (1) { cin >> iVal; if (cin.eof()) { break; } int i = 1; while (iVal) { arrStampType[i ++] = iVal; cin >> iVal; } arrStampType[0] = i - 1; i = 1; cin >> iVal; while (iVal) { arrCustomer[i ++] = iVal; cin >> iVal; } arrCustomer[0] = i - 1; cal(); } return 0; } void cal() { sort(&arrStampType[1], arrStampType + arrStampType[0] + 1); for (int i = 1; i <= arrCustomer[0]; i ++) { calRequest(arrCustomer[i]); } return; } void calRequest(int iRequest) { memset(arrAnswer, 0, sizeof (arrAnswer)); int iSum; for (int i = arrStampType[0]; i >= 1; i --) { iSum = arrStampType[i]; if (iSum > iRequest) { // 第一个数,可以省略 // iSum -= arrStampType[i]; continue; } if (iSum == iRequest) { // 判断种类 judgeBetter(i, -1, -1, -1); continue; } for (int j = i; j >= 1; j --) { iSum += arrStampType[j]; if (iSum > iRequest) { iSum -= arrStampType[j]; continue; } if (iSum == iRequest) { judgeBetter(i, j, -1, -1); iSum -= arrStampType[j]; continue; } for (int k = j; k >= 1; k --) { iSum += arrStampType[k]; if (iSum > iRequest) { iSum -= arrStampType[k]; continue; } if (iSum == iRequest) { judgeBetter(i, j, k, -1); iSum -= arrStampType[k]; continue; } for (int l = k; l >= 1; l --) { iSum += arrStampType[l]; if (iSum > iRequest) { iSum -= arrStampType[l]; continue; } if (iSum == iRequest) { judgeBetter(i, j, k, l); iSum -= arrStampType[l]; continue; } iSum -= arrStampType[l]; break; } iSum -= arrStampType[k]; } iSum -= arrStampType[j]; } iSum -= arrStampType[i]; } if (arrAnswer[0] == 0) { cout << iRequest << " ---- none" << endl; return; } if (arrAnswer[6] == 1) { cout << iRequest << " (" << arrAnswer[1] << "): " << "tie" << endl; return; } cout << iRequest << " (" << arrAnswer[1] << "):"; for (int i = arrAnswer[0] - 1; i >= 2 ; i --) { cout << " " << arrAnswer[i]; } cout << endl; return; } void judgeBetter(int i, int j, int k, int l) { int iTpCnt = 4; bool bBetter = false; if (l == -1) { iTpCnt --; if (k == -1) { iTpCnt --; if (j == -1) { iTpCnt --; } } } int iStmpCnt = iTpCnt; if (j != -1) { if (i == j) { iTpCnt --; } if (k != -1) { if (j == k) { iTpCnt --; } if (l != -1) { if (k == l) { iTpCnt --; } } } } // 比现有答案的种类多 if(iTpCnt > arrAnswer[1]) { bBetter = true; } // 种类一样多 else if (iTpCnt == arrAnswer[1]) { // 比现有答案的张数少 if (iStmpCnt < arrAnswer[0] - 2) { bBetter = true; } // 张数一样多 else if (iStmpCnt == arrAnswer[0] - 2) { // 比现有答案的最大面额大 if (arrStampType[i] > arrAnswer[2]) { bBetter = true; } // 最大面额一样 else if (arrStampType[i] == arrAnswer[2]) { // 出现tie arrAnswer[6] = 1; } } } if (bBetter) { arrAnswer[1] = iTpCnt; arrAnswer[0] = 2 + iStmpCnt; arrAnswer[2] = arrStampType[i]; if (j != -1) { arrAnswer[3] = arrStampType[j]; if (k != -1) { arrAnswer[4] = arrStampType[k]; if (l != -1) { arrAnswer[5] = arrStampType[l]; } } } arrAnswer[6] = 0; } }
发表评论
-
POJ 1009 解题报告 Edge Detection
2011-12-18 21:13 30681009是痛苦的一题啊 ... -
POJ 1008 解题报告 Maya Calendar
2011-12-16 17:54 1081还是要细心啊,题目不难,历法转换。 AC吧,这么简单 ... -
POJ 1007 解题报告 DNA Sorting
2011-12-15 17:43 951#include <iostream> # ... -
POJ 1006 解题报告 Biorhythms
2011-12-15 17:39 965同理小学生计算题? 还是我没想到什么? #inc ... -
POJ 1005 解题报告 I Think I Need a Houseboat
2011-12-15 17:36 856好吧,小朋友的数学题。 #include <io ... -
POJ 1004 解题报告 Financial Management
2011-12-15 17:34 3092超水一题。 #include <iostream ... -
POJ 1003 解题报告 Hangover
2011-12-15 17:32 1107简单题。 注意不要重复计算。 使用二分查找的思想。 ... -
POJ 1002 解题报告 487-3279
2011-11-25 15:53 1024典型的字符串处理问题。 刚开始用的vector,果断超时。题 ... -
POJ 1001 解题报告 Exponentiation
2011-11-25 15:15 1610高精度浮点数计算。 花了我整整一天时间才写好,POJ ...
相关推荐
【描述】"北大POJ1010-STAMPS"解题报告+AC代码,意味着这是一个关于如何解决这个特定问题的详细解答,包含了问题分析、算法设计以及通过测试(Accepted,通常缩写为AC)的源代码。解题报告通常会包含问题背景、输入...
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1440解题报告 poj 1440解题报告 poj 1440解题报告 poj 1440解题报告
poj 3083解题报告poj 3083解题报告poj 3083解题报告poj 3083解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
poj 3720解题报告poj 3720解题报告poj 3720解题报告poj 3720解题报告
《POJ 1010 Stamps:解题思路与陷阱分析》 POJ 1010,也被称为“邮票问题”,是编程竞赛中的一道经典题目,旨在考察参赛者的动态规划和数学思维能力。这个题目在编程爱好者中具有较高的知名度,因为它涉及到有趣的...
这个“北大poj解题报告”包含了作者在使用POJ平台解题过程中的学习总结和经验分享,旨在帮助软件工程专业的学生提升编程能力和算法理解。 解题报告通常会涵盖以下几个方面: 1. **基础算法讲解**:解题报告中可能...
标题“POJ1010-STAMPS 测试数据”涉及的是一个编程竞赛问题,源自北京大学ACM(美国计算机学会)在线判题系统POJ(Problem Online Judge)。问题STAMPS是1998年太平洋西北地区的比赛题目,旨在考验参赛者解决实际...
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
### poj1691解题报告 #### 题目信息 - **题目名称**:Painting A Board - **时间限制**:1S - **内存限制**:1000K - **提交总数**:62 - **通过总数**:35 - **来源**:...
【ACM竞赛与北大POJ解题报告】 在编程竞赛领域,ACM(国际大学生程序设计竞赛,简称ACM/ICPC)是一项极具影响力的比赛,它挑战参赛者的算法设计、问题理解和快速编码能力。北京大学(Peking University)的在线判题...
【北大ACM_POJ_解题报告】是北京大学ACM在线评测系统POJ的解题资源集合,这个压缩包包含了对POJ平台上的各种类型ACM竞赛题目的详细解答。ACM,全称国际大学生程序设计竞赛(International Collegiate Programming ...
【标题】"80道POJ解题报告"所涉及的知识点主要集中在ACM(国际大学生程序设计竞赛)和POJ(编程Online Judge系统)上。POJ是北京大学主办的一个在线编程竞赛平台,广泛用于训练和提升程序员的算法设计与实现能力。80...
【POJ 1316 解题报告】 本题源自北京大学举办的ACM竞赛,题号为POJ 1316,主要涉及算法设计和数组的应用。题目要求找到10000以内的所有self-number,并输出它们。Self-number是一个特殊的整数序列,它的定义是该数...
《POJ 2392解题报告:高效计算最高堆积高度》 本文将深入解析POJ 2392这个编程题目,该题目要求利用给定的不同高度、耐压性和数量的block,来确定能够堆叠出的最大高度。解决这个问题的关键在于运用排序和动态规划...
在解题报告中提及,如果排序后的第一头牛的开始位置`x1`大于1,则直接输出-1。这是因为题目要求整个地板都能被清洁到,如果起始位置就存在无法覆盖的区域,那么无论后续如何安排牛,都无法满足题目的要求,因此这是...
ACM Poj Pku 解题报告答案 打包 下载 600多题 史上最全 不是网上乱传的200多题,更不是100多题就挂着10分才能下的题 下了这个 大家也不要浪费分数去下载其它版本的了,基本上都有 共享 一起进步 中国加油 ACMer...