牛客 第十五届华中科大邀请赛 J Mex 【贪心】

J Mex


在这里插入图片描述

输入

3
1 2 5

输出

4

说明:

S’=(), ∑S’=0
S’=(1), ∑S’=1
S’=(2), ∑S’=2
S’=(1,2), ∑S’=3
S’=(5), ∑S’=5
There is no way for ∑S’=4, hence 4 is the answer.

题目
呜呜呜,签到题都不会,菜枯辽。第一次爆零,补个签到题留念。
这个算思维题?贪心?我不懂

题意:求一个序列的所有子序列和中,没有出现的最小数。
因为序列长度为1e5,所以复杂度不能超过 O(nlogn) 。


找规律。
首先,思考有没有一个无敌的序列,使 ans = 序列总和+1

序列ans
12
1 24
1 2 48
1 2 4 816
1 2 4 8 1631

1.以第3个序列为例,此序列满足存在 任意小于8 的子序列和。
2.此时在第4个序列 把 8 加入序列中,由 1 知可以找到序列和=8+1、8+2、8+3、……、8+7,所以第4个序列满足存在 任意小于16 的子序列和。
……(然后可以找到规律了

if(a[i]>sum+1)	ans=sum+1;
#include<cstdio>
#include<algorithm>
using namespace std;

#define ll long long
const int Max_num=1e5+17;
ll a[Max_num];

int main(){
	int n; scanf("%d",&n);
	for(int i=0;i<n;++i) scanf("%lld",&a[i]);
	sort(a,a+n);
	if(a[0]!=1) {printf("1\n"); return 0;}
	ll sum=a[0];
	for(int i=1;i<n;++i){
		if(a[i]>sum+1) break;
		sum+=a[i];
	}
	
	printf("%lld\n",sum+1);
	
	return	0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值