Codeforces Round #625 (Div. 2, based on Technocup 2020 Final Round)ABC

A. Contest for Robots

#include 
using namespace std;
int a[1005],b[1005];
int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    int e=0,r=0;
    for(int i=1;i<=n;i++){
        if(a[i]>b[i])e++;//计算a多的个数 
        else if(a[i]<b[i])r++;//计算b多的个数 
    }
    if(e==0)cout<<-1<<endl;
    else cout<<r/e+1<<endl;
    return 0;
}

B. Journey Planning

将b数组的每个元素减去其对应的下标
如第一个样例10,7,1,9,10,15
变成9,5,-2,5,5,9
易得相同的值对应的原元素的和即为一次能取的和
如对数字5,一次可取第二个,第四个,第五个
即sum=7+9+10
防止减成负数因此再加上2e5
注意b的最大值是4e5,而不是2e5,所以遍历sum要遍历到6e5

#include 
using namespace std;
typedef long long ll;
ll f[600010];
int main(){
    int n;cin>>n;
    ll maxs=-1;
    for(int i=1;i<=n;i++){
        ll x;cin>>x;
        x=x-i+200000;
        f[x]+=(x-200000+i);
    }
    for(int i=0;i<=600005;i++)maxs=max(maxs,f[i]);
    cout<<maxs;
}

C. Remove Adjacent

题意:对一个字符串,若某个字符(如字符a)的前面或后面比该字符正好大1(如字符b),则可以删掉b,求最多能删几个
贪心,打个比方如果你要删掉b,那么b旁的a没被删掉是最优的
所以按照字典序逆序,即从z到a删除
即第一轮判断所有z能否被删除
删除一个字符后,要生成新的字符串,并从头开始遍历
否则过不了 3 zzy

#include 
using namespace std;
typedef long long ll;
int x;string s;
int main(){
    cin>>x>>s;
    int sum=0;
    for(int i=25;i>=0;i--){
        for(int j=0;j<x;j++){
            if(s[j]-'a'==i){
                if((j>0&&(s[j-1]-'a')==i-1)||(j<x-1&&(s[j+1]-'a')==i-1)){
                    s.erase(j,1);//删除该字符
                    x--;//位数-1
                    sum++;
                    j=-1;//j=-1才能实现从头遍历
                }
            }
        }
    }
    cout<<sum;
}

你可能感兴趣的:(Codeforces)