【2020.8.23NOIP模拟赛】失落

【 2020.8.23 N O I P 模 拟 赛 】 失 落 【2020.8.23NOIP模拟赛】失落 2020.8.23NOIP


题目描述

出题人心情很失落,于是他直接告诉你让你求出一个集合中所有数所不能凑出来的最小的数是多少。


输入

第一行一个整数 n n n

第二行 nn 个整数 a i a_i ai


输出

一个整数表示答案。


样例输入

3
5 1 2

样例输出

4

题目解析

这道题是一道数学题,以 a n s ans ans来表示在这个集合里最小的不能凑出来的整数。
因为 a i a_i ai的最小值为 1 1 1,所以 a n s ans ans的初始值为 1 1 1

然后这里有个规律(默认 a i a_i ai是不会重复的):
如果集合里没有 1 1 1,那么这个集合凑不出的最小数就是 1 1 1
而如果有 1 1 1,而且没有 2 2 2,答案就是 2 2 2
以上不是显而易见
我们把 a i a_i ai升序排序先,然后从 1 1 1循环到 n n n,如果 a i ≤ a n s a_i≤ans aians(即 a i a_i ai是属于可以凑出来),那么就把 a n s + = a i ans += a_i ans+=ai(把可以凑出来的范围加大)


code

#include <stdio.h>

#include <iostream> 

#include <algorithm>

#define ll long long

using namespace std;

ll n, ans=1; 
ll a[100005];

int main ()
{
	scanf ("%lld", &n);
	for (register ll i = 1; i <= n; ++ i) scanf ("%lld", &a[i]);
	sort (a + 1, a + 1 + n);
	for (register ll i = 1; i <= n; ++ i) 
	{
		if (a[i] <= ans) ans += a[i];
	}
	printf("%lld",ans);
	return 0;
}
posted @ 2020-08-23 15:35  unknown_future  阅读(54)  评论(0编辑  收藏  举报