Codeforces Round 899 (Div. 2)

Problem - A - Codeforces

AC代码:

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=110;
int a[N],b[N];
int n;
void solve() {
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    int cnt=1;
    for(int i=1;i<=n;i++){
        while(cnt==a[i]||cnt==b[i-1]) cnt++;
        b[i]=cnt;
    }
    cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - B - Codeforces

首先,能确定的是至少删除一个元素,那么枚举每一个元素,使得该元素不出现,那些含有该元素的集合都不选,其它集合元素并起来,每次取max

AC代码:

#include
#define endl '\n'
//#define int long long
using namespace std;
const int N=55;
bool vis[N];//vis[i]=0表示集合i保留,vis[i]=1表示集合i删除
int n;
setq;//存放删除某些集合后剩下的并
int ans;

void solve() {
    cin>>n;
    vector>e(N);
    vector>g(N);
    setse;//存放所有集合的并(自动去重)
    for(int i=1; i<=n; i++) {
        int k;
        cin>>k;
        for(int j=1; j<=k; j++) {
            int x;
            cin>>x;
            se.insert(x);
            e[i].push_back(x);//集合i中存放哪些数
            g[x].push_back(i);//数s[i][j]存在于哪些集合中
        }
    }
    ans=0;
    //枚举每一个数,求当它不出现时集合并的个数是多少
    for(auto v:se) {
        for(int i=1;i<=N;i++) vis[i]=false;
        q.clear();
        for(auto u:g[v]) {
            vis[u]=true;
        }
        for(int i=1; i<=n; i++) {
            if(vis[i]) continue;
            for(auto x:e[i]) q.insert(x);
        }
        ans=max(ans,(int)q.size());
    }
    cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

Problem - C - Codeforces

首先删除一个数必然会改变后面的位置的奇偶性,那么就想从后往前进行操作

当我们遇到正数时,肯定是想要的,遇到负数就不要

如下图,9要,8不要,7要,然后6想要,但是由于6是偶数,只能直接删掉,因为5也想要,所以先要5,然后刚才的6就变成5了,那么刚才的6也能要了,然后4不要,3要,2不要,1要

从这个过程我们可以发现,如果对奇数位置的数操作,我们可以得到它连同它后面所有的正数,如果对偶数位置的数操作,我们可以得到它后面所有的正数

所以我们可以选择对位置1进行操作得到它加上它后面所有的正数,或者对位置2进行操作,得到从3开始的所有的正数

AC代码:

#include
#define endl '\n'
#define int long long
using namespace std;
const int N=2e5+10;
int a[N];
int n;
void solve() {
    cin>>n;
    int sum=0;
    int ans=0;
    memset(a,0,sizeof a);
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=3;i<=n;i++) {
        if(a[i]>0) sum+=a[i];
    }
    ans=sum+a[1];
    if(a[2]>0) ans+=a[2];
    ans=max(ans,sum);
    cout<>t;
    while(t--) {
        solve();
    }
    return 0;
}

你可能感兴趣的:(codeforces,c++,算法)