网易游戏2013年校招笔试题----货币面值

货币面值

时间限制:1 秒

内存限制:128 兆

特殊判题:

提交:351

解决:132

题目描述:

小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在游戏中购买各种装备来提升自己。有一天,他突然很想知道这些纸币的组合不能表示的最小面额是多少,请聪明的你来帮助小虎来解决这个财政问题吧。

输入:

输入包含多个测试用例,每组测试用例的第一行输入一个整数N(N<=100)表示流通的纸币面额数量,第二行是N个纸币的具体表示面额,取值[1,100]。

输出:

对于每组测试用例,输出一个整数,表示已经发行的所有纸币都不能表示的最小面额(已经发行的每个纸币面额最多只能使用一次,但面值可能有重复)。

样例输入:
5
1 2 3 9 100
5
1 2 4 9 100
5
1 2 4 7 100
样例输出:
7
8
15

先排序。然后从小到大相加。比如在 i 处。只要0到i-1的所有值之和都小于i-1。那么可以说所构成的值到此为止出现“断面”。即无法连续。输出前面0到i-1的值之和再加一就好了。


#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int n,val[110];
	while(cin>>n)
	{
		for(int i=0;i<n;i++)
		{
			cin>>val[i];
		}
		sort(val,val+n);
		int sum=0;
		for(int i=0;i<n;i++)
		{
			if(sum+1<val[i])
				break;
			sum+=val[i];
		}
		cout<<sum+1<<endl;
	}
}
/*第一次的时候for循环我是这么写的
*/
for(int i=0;i<n-1;i++)
{
	sum+=val[i];
	if(sum+1<val[i+1])
		break;
}
/*这个有严重问题。
举例:n=5时
1、2、3、5、6
这样在sum=1+2+3+5=11的时候就结束循环了。输出12(sum+1)
而如果将循环改为:*/
for(int i=0;i<n;i++)
{
	sum+=val[i];
	if(sum+1<val[i+1])
		break;
}
/*这时在遍历到i=n-1:
即sum=11+6=17的时候
会试探着比较sum+1和val[i+1]也就是val[7]
而val[7]的值是不确定的。
*/



posted on 2013-08-27 13:07  果冻虾仁  阅读(236)  评论(0编辑  收藏  举报

导航