A.
贪心的维护一个值id,每次id++,若当前id等于了a[i],那么就再加加,最后的id值就是答案
void solve(){
int n;
cin >> n ;
vector<int>a(n);
int id = 1;
for(int i = 0;i<n;i++){
cin >> a[i];
if(a[i]!=id){
a[i] = id;
}else{
id++;
a[i] = id;
}
id++;
}
cout<<a[n-1]<<'\n';
}
B.
对于固定的 𝑖,从 𝑆1,𝑆2,⋯,𝑆𝑛,中选出所有不包含 𝑖的集合。它们的集合的大小将是 𝑆 的最大大小对于𝑇中的所有𝑖都这样做,那么其中的最大值就是答案。
void solve(){
int n;
cin >> n;
vector<set<int>>a(n);
set<int>s;
for(int i = 0;i<n;i++){
int k;
cin >> k;
while(k--){
int x;
cin >> x;
a[i].insert(x);
s.insert(x);
}
}
int ans = 0;
for(int i = 1;i<=50;i++){
if(s.count(i)){
set<int>h;
for(int j = 0;j<n;j++){
if(a[j].count(i)) continue;
h.insert(a[j].begin(),a[j].end());
}
ans = max(ans,(int)h.size());
}
}
cout<<ans<<"\n";
}
C.
可以发现,a中第三个元素之后的值都可以得到,但是若要选择第二个,那么就要选择第一个,所以答案就是 3-n中的所有正值的和 与a[1]加上2-n中所有正值的和。
#define ll long long
void solve(){
int n;
cin >> n;
vector<int>a(n);
for(int i = 0;i<n;i++){
cin >> a[i];
}
ll sum1 = 0,sum2 = a[0];
// if(a[0]>0) sum1 = a[0];
for(int i = 2;i<n;i++){
if(a[i]>0)sum1+=a[i];
}
for(int i = 1;i<n;i++){
if(a[i]>0)sum2+=a[i];
}
cout<<max(sum1,sum2)<<endl;
// else
// cout<<sum1<<endl;
}