Codeforces Round #402 (Div. 2) A B C D

Codeforces Round #402 (Div. 2)

没补完。。。

A:Pupils Redistribution

题意:交换a、b数组中的值,使a、b中每个数值得数量相同

统计a、b数组中每个数值得个数,用ai表示数组a中含 i 的个数

if(ai+bi是奇数) 那么无论怎么交换,a、b中i的数量都不一样,输出-1;

else | ai-bi | /2 表示数值 i 要从一个数组移动到另一个数组的个数

#include<bits/stdc++.h>
using namespace std;

int a[10]={0},b[10]={0};
int n,c;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>c;
        a[c]++;
    }
    for(int i=0;i<n;i++){
        cin>>c;
        b[c]++;
    }
    int cnt=0;
    for(int i=1;i<=5;i++){
        if((a[i]+b[i])%2){
            cout<<"-1
";
            return 0;
        }
        else{
            c=a[i]-b[i];
            if(c<0) c=-c;
            cnt+=c/2;
        }
    }
    cout<<cnt/2<<"
";
    return 0;
}
View Code

B:Weird Rounding

题意: 给你一个数n,求该数删掉多少个数后,使得n%1ek==0

从最后一个非0数开始删

#include<bits/stdc++.h>
using namespace std;

char str[100];
int k;
int main(){
    cin>>str>>k;
    int l=strlen(str);
    int cnt=0;
    while(l-cnt>=k){
        bool flag=true;
        int ans=0;
        for(int i=1;i<=k;i++){
            if(str[l-cnt-i]!='0'){
                flag=false;
                //cout<<l-cnt-i<<"..
";
                str[l-cnt-i]='0';
                ans++;
            }
        }
        cnt+=ans;
        if(flag) break;
    }
    if(l-cnt>=k)cout<<cnt<<"
";
    else cout<<l-1<<"
";
    return 0;
}
View Code

C:Dishonest Sellers

题意:有n个商品,第一周 i 商品价格为ai ,第二周价格为 bi,但是第一周必须买k个商品,求买下n个商品的最小花费

贪心:第一周买的k个商品,首先选ai<bi的商品,然后选ai和bi差距小的;

按ai-bi从小到大排序,取前k个的a,后面的选min(ai,bi)

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+100;
typedef long long ll;
int n,k,c;
struct node{
    int a,b;
}nd[N];

bool cmp(node x,node y){
    return x.a-x.b<y.a-y.b;
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>c;
        nd[i].a=c;
    }
    for(int i=0;i<n;i++){
        cin>>c;
        nd[i].b=c;
    }
    sort(nd,nd+n,cmp);
    
    ll res=0;
    for(int i=0;i<k;i++){
        res=res+(ll) nd[i].a;
    }
    for(int i=k;i<n;i++){
        res=res+(ll)min(nd[i].a,nd[i].b);
    }
    cout<<res<<"
";
    return 0;
}
View Code

D:String Game

题意: 给你两个字符串s1、s2,按所给数组a,依次删掉s1 ai位置上的字母,但是要保证s1中含有s2,求最多能删多少个

二分删除的个数。

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;

string s1,s2;
int a[N];

bool solve(int n){
    string s3=s1;
    for(int i=0;i<n;i++){
        s3[a[i]-1]='*';
    }
    int j=0;
    for(int i=0;i<s3.length();i++){
        if(s3[i]==s2[j]){
            j++;
        }
        if(j==s2.length()) return true;
    }
    return false;
}

int main(){
    cin>>s1>>s2;
    for(int i=0;i<s1.length();i++){
        cin>>a[i];
    }
    int l=0,r=s1.length(),mid;
    while(l<=r){
        mid=(l+r)/2;
        if(solve(mid)) l=mid+1;
        else r=mid-1;
    }
    cout<<r<<"
";
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/YJing814/p/10974234.html