第二天,前缀和拼不出来的数

题拼不出来的数

这个样例其实很水,用馍拟都能做出来。可要是不水呢?

会钱缀和没做出来的大佬,往后翻。

那就要用钱缀和

#include <bits/stdc++.h>
using namespace std;
long long n;
long long a[100001],s[100001];
int main(){
	cin >> n;
	for (int i = 1;i <= n;i++) cin >> a[i];
	for (int i = 1;i <= n;i++) s[i] = s[i - 1] + a[i];
	for (int i = 1;i <= n;i++) cout<<s[i]<<' ';
	return 0;
}

先看这个代码,我们将a熟组输入进来了,又定义了一个熟组s。而这个数组s则是前缀和熟组。当i等于1时,s[1]就等于a[1],因为你懂的。i等于2时,s[2]就等于s[1] + a[2],而s[1]等于a[1],所以s[2]等于a的第一个元素+a的第二个元素,后面以此内推。

所以s最后一个元素是,a熟组的所有元素之和,简单拿捏。

而这道题,是个变形,先上代码自己看:

#include <bits/stdc++.h>
using namespace std;
int n;
long long a[100010],s[100010];
int main(){
	scanf("%d", &n);
	for (int i = 1;i <= n;i++) scanf("%d", &a[i]);
	sort(a + 1,a + 1 + n);
	for (int i = 1;i <= n;i++){
		s[i] = s[i - 1] + a[i];//原型钱缀和
		if (s[i - 1] + 1 < a[i]){
			cout<<s[i - 1] + 1;
			return 0;
		}
	}
	cout<<s[n] + 1;
	return 0;
}

已知在循环中,套了一个基础的钱缀和公式,只加了一个判断就对了为什呢?很简单,只要在排完序的熟组中这么判断,就说明找到了最大和最小的元素中间的拼不出来的数,就输出。

而在中间没找到的,肯定在最后也就是,s[n]+1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值