这个样例其实很水,用馍拟都能做出来。可要是不水呢?
会钱缀和没做出来的大佬,往后翻。
那就要用钱缀和
#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。