codeforce #625 div2

传送门

A. Contest for Robots

题意

两个序列\(a,b\)表示一个比赛,分别输入\(a,b\),输入是1 代表这个回合得分,每个位置上的\(a,b\)是对应的回合,
二者在某一个回合可能都得分,求能够使\(a\)的总和大于\(b\)的总和中\(a\)的分最大值的可能的最小值

数据范围

\(1\leq n\leq 100\)
\(0 \leq r_{i} \leq 1\)
\left(0 \leq b_{i} \leq 1\right)

题解

分别统计\(a\)的个数和\(b\)的个数以及二者共同的个数分情况求解

Code

cpp
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n;
bool a[N],b[N];
int main(){
    cin>>n;
    int ans=1;
    int suma=0,sumb=0,same=0;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        a[i]=x;
        if(x)
            suma++;
    }
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        b[i]=x;
        if(x && a[i]) same++;
        if(x) sumb++;
    }

    if(suma == same && sumb >= same) {
        ans=-1;
    }
    else if(suma>sumb) {
        ans=1;
    }
    else if(suma <= sumb) {
        int now=suma-same;
        int need=sumb-same-now;

        ans+=need/now;
        ans+=1;

    }
    cout<<ans<<endl;
}

B. Journey Planning

题意

给定\(b\)序列,从中挑选满足\(C_{i+1}-C_{i} = b_{ci+1}-b_{ci}\) 的最大的集合

数据范围

\(1\leq n\leq 2 \times 10^{4}\)
\(1 \leq b_{i} \leq 4 \cdot 10^{5}\)

题解

$C_{i+1}-b_{ci+1} =C_{i} -b_{ci} $通过变换变成了一个满足下标和值的差相同的是一个集合直接hash将同一个集合累加起来求最大值即可

Code

cpp
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N=2e5+10;
unordered_map<ll,ll>p;
int main(){
    ll n;
    cin>>n;
    ll ans=INT_MIN;
    for(int i=1;i<=n;i++){
        ll x;
        cin>>x;
        p[x-i]+=x;
        ans=max(ans,p[x-i]);
    }
    cout<<ans<<endl;
}

C. Remove Adjacent]

题意

长度小于100的字符串, 对于\(i\)位置可以删去的条件是\(i-1\)或者\(i+1\)位置是它的上一个字母(比如\(a\)对于\(b\)\(d\)对于\(e\)
删去元素后前后两段合并,意味着\(i-1\)\(i+1\)相邻了,求最多能删去多少个元素

数据范围

\(1 \leq|s| \leq 100\)

题解

从字母\(z\)\(b\)开始模拟,保证了每个字母后面没有大的可以删,满足最优
每个字母如果进行了删除操作,需要再遍历一次这个字母,因为删除以后相邻的可能会满足条件。

Code

cpp
#include<bits/stdc++.h>
#define N 110
using namespace std;

bool vis[N];

int main(){
    int n;
    string s;
    cin >> n >> s;
    int ans = 0;
    for(int i = 25; i > 0; --i){
        char now = 'a' + i;
        int lastans = ans;
        for(int j = 0; j < n; ++j){
            int pre = j - 1, nex = j + 1;
            while(pre >= 0 && vis[pre]){
                pre--;
            }
            while(nex < n && vis[nex]){
                nex++;
            }
            if(!vis[j] && s[j] == now && ((pre < 0 ? 0 : s[j] - s[pre] == 1) || (nex == n ? 0 : s[j] - s[nex] == 1))){
                ans++;
                vis[j] = true;
            }
        }
        if(ans > lastans){
            i++;
        }
    }
    cout << ans << endl;
    return 0;
}
posted @ 2020-05-01 14:01  Hyx'  阅读(116)  评论(0)    收藏  举报