• 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
  • 相关阅读:
    页面布局之简单两列布局——全屏,左边固定,右边自适
    Linq To Sql学习经验
    C#、.NET Framework、CLR的关系
    LINQ查询知识总结:案例分
    泛型的理解
    win7系统如何安装使用IIS(网站服务器)
    DataGridView实现各种效果
    对路径的访问被拒绝,解决之后又报-未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序。
    sublime text 设置SCSS的查看语法
    VS建解决方案
  • 原文地址:https://www.cnblogs.com/YJing814/p/10974234.html
Copyright © 2020-2023  润新知