杭电OJ 1205 WA的产生可能由于数据类型不够大

原创 2016年05月31日 16:32:43



Problem Description
HOHO,终于从Speakless手上赢走了所有的糖果,是Gardon吃糖果时有个特殊的癖好,就是不喜欢将一样的糖果放在一起吃,喜欢先吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?请你写个程序帮忙计算一下。
 

Input
第一行有一个整数T,接下来T组数据,每组数据占2行,第一行是一个整数N(0<N<=1000000),第二行是N个数,表示N种糖果的数目Mi(0<Mi<=1000000)。
 

Output
对于每组数据,输出一行,包含一个"Yes"或者"No"。
 

Sample Input
2 3 4 1 1 5 5 4 3 2 1
 

Sample Output
No Yes
Hint
Hint
Please use function scanf


题目的解法很巧妙,一下是关于题目的分析:

---------------------------------------------------------------------

假设有四种糖果,6A3B2C1D,首先想到的是先把最多的糖果都分隔开,A?A?A?A?A?A,3个B和2个C恰好能放满那五个空位,剩下的1个D就随便放了。其实,"?"区域,即最大数目的糖果之间的空隙(max-1),只要有其他糖果填上,剩下的多余糖果都一定可以放好位置(即使每个空隙只放一个同种类的糖果,总有足够的空隙放糖果),因为A与A已经把它们分隔了。因此,问题本质就是排除最多数目的糖果(若这样的糖果不止一种,只排除其中任意一种),其余的糖果的总数sum加1不少于最多的糖果数就Yes。

转自http://www.cnblogs.com/ZShogg/archive/2012/03/22/2411316.html

--------------------------------------------------------------------------


这一题另一个坑就是数据类型的选择问题。一开始,我选择了int,总是报WA,后来仔细审题发现:通过累加糖果数量sum,sum是可以超过int的最大表示范围的!

故这一题的sum应当选用_64int

这也为WA错误产生的原因提供了一种纠错的想法!



AC代码:


#include <iostream>
#include <algorithm>
using namespace std;

bool Large(int a,int b)
{
	return a>b;
}


int A[1000000];



int main()
{
	//freopen("D:\\input.txt","r",stdin);
	//freopen("D:\\output.txt","w",stdout);
	int n;
	int m;
	int i=0;
	__int64 sum=0;
	while(cin>>n)
	{
		while(n--)
		{
			i=0;
			sum=0;
			memset(A,0,sizeof(A));
			cin>>m;
			while(m--)
			{
				cin>>A[i++];
			}
			sort(A,A+i,Large);
			for(int k=1;k<i;k++)
			{
				sum+=A[k];
			}
			if(sum>=A[0]-1)
				cout<<"Yes"<<endl;
			else 
				cout<<"No"<<endl;
		}
	}
}


杭电oj题库分类

分类一:   基础题:1000、1001、1004、1005、1008、1012、1013、1014、1017、1019、1021、1028、1029、1032、1037、1040、1048、...
  • zwj1452267376
  • zwj1452267376
  • 2014年12月23日 21:52
  • 1943

最短路(杭电oj2544)(迪杰斯特拉)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm...
  • hdd871532887
  • hdd871532887
  • 2014年12月10日 22:53
  • 658

杭电ACM——自我强化步骤

实验室的师兄编程都很牛逼,我这个小菜鸟私下跟他们讨教了怎样变成牛逼的绝招,“练练练,写写写”这是他们给我的回答。尽管平时他们做项目很忙,但总是会抽出时间刷刷ACM。现在也感觉自己反应速度和算法能力有些...
  • Always2015
  • Always2015
  • 2015年04月09日 21:35
  • 6113

杭电acm题目分类 非常详细

按此做成就大神之路:   1002 简单的大数 1003 DP经典问题,最大连续子段和 1004 简单题 1005 找规律(循环点) 1006 感觉有点BT的题,我到现在还没过 1007...
  • lsgqjh
  • lsgqjh
  • 2015年03月13日 17:49
  • 8158

杭电OJ测试数据挖掘计划

前言 首先,HDUOJ已经出现多年,上面的大部分经典题目已经被被人咀嚼透烂了,也能通过搜索引擎搜索到许多现成的代码。如果有测试数据,那么就能拿自己的程序的输出与前人的程序的输出进行比对,找出问题所在...
  • hoxily
  • hoxily
  • 2015年03月28日 16:31
  • 891

杭电OJ题目 1000

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
  • nxy006
  • nxy006
  • 2015年06月27日 20:49
  • 3941

杭电acm1271 整数对

Problem Description Gardon和小希玩了一个游戏,Gardon随便想了一个数A(首位不能为0),把它去掉一个数字以后得到另外一个数B,他把A和B的和N告诉了小希,让小希猜想他原...
  • yeweiyang16
  • yeweiyang16
  • 2015年09月28日 22:15
  • 475

【杭电OJ】--1052-田忌赛马(贪心,双端队列)

U - Tian Ji -- The Horse Racing   Here is a famous story in Chinese history.  "That was...
  • Greenary
  • Greenary
  • 2017年02月14日 22:25
  • 264

菜鸟上路,杭电OJ1003 最大子串问题

Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max s...
  • ssdut_209
  • ssdut_209
  • 2016年05月20日 10:19
  • 1099

【杭电oj】1280 - 前m大的数(水)

前m大的数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su...
  • wyg1997
  • wyg1997
  • 2016年03月19日 20:13
  • 193
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杭电OJ 1205 WA的产生可能由于数据类型不够大
举报原因:
原因补充:

(最多只允许输入30个字)