zoukankan      html  css  js  c++  java
  • codeforces 779

    2 个集合分别有 n个数字

    交换a b中的 数字 使得2个集合中数字数目一样 

    直接模拟 

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #include<string>
    using namespace std ;
    
    #define LL long long
    #define MAXN 500010
    
    int s1[6],s2[6];
    
    int main()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            s1[a]++;
        }
        for(int i=1;i<=n;i++)
        {
            int a;
            scanf("%d",&a);
            s2[a]++;
        }
        int ok=0;
        for(int i=1;i<=5;i++)
        {
            if((s1[i]+s2[i])%2==1)
                ok=1;
        }
        if(ok==1)
            printf("-1
    ");
        else
        {
            int ans=0;
            for(int i=1;i<=5;i++)
            {
                if(s1[i]<s2[i])
                {
                   // printf("%d %d %d
    ",s1[i],s2[i],ans);
                    int a=(s2[i]-s1[i])/2;
                    ans=ans+a;
                    s1[i]=s2[i]=s1[i]+a;
                   //printf("%d %d %d
    ",s1[i],s2[i],ans);
                    int j=i+1;
                        while(a>0)
                        {
                            while(s1[j]>s2[j]&&a>0)
                            {
                                a--;
                                //printf("%d
    ",a);
                                // printf("%d %d
    ",s1[j],s2[j]);
                                s1[j]--;
                                s2[j]++;
                               // printf("%d %d
    ",s1[j],s2[j]);
                            }
                            j++;
                        }
                }
                else if(s1[i]>s2[i])
                {
                   // printf("%d %d %d
    ",s1[i],s2[i],ans);
                    int a=(s1[i]-s2[i])/2;
                    ans=ans+a;
                    s1[i]=s2[i]=s2[i]+a;
                   // printf("%d
    ",ans);
                    int j=i+1;
                        while(a>0)
                        {
                            while(s1[j]<s2[j]&&a>0)
                            {
                                a--;
                                s2[j]--;
                                s1[j]++;
                            }
                            j++;
                        }
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code

     B

    删掉一些数字 使他能被 10^k 整除

    最少删除几个数字

    从后往前  把不是0的数字删掉  然后计数0

    题目说肯定有解

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #include<string>
    using namespace std ;
    
    #define LL long long
    #define MAXN 500010
    
    int dig[15];
    
    int main()
    {
        int n,k,m;
        scanf("%d%d",&n,&k);
        int len=0;
        m=n;
        while(n)
        {
            dig[++len]=n%10;
            n=n/10;
        }
        if(m==0)
            printf("0
    ");
        else
        {
            int cnt=0,num=0;
            int ok=0;
    
            for(int i=1;i<=len;i++)
            {
                if(dig[i]==0)
                    num++;
                else
                    cnt++;
                if(num==k)
                {
                    ok=1;
                    break;
                }
            }
            if(ok==1)
                printf("%d
    ",cnt);
            else
            {
                printf("%d
    ",len-1);
            }
        }
        return 0;
    }
    View Code

    C

    n 个物品  立刻要至少买 k 个 物品 降价前的价格和降价后的价格

    显然  后面要升价的物品 怎么样都要先买 然后降价后的再买  

    根据 价格的差排序

    #include <iostream>
    #include<string.h>
    #include<stdio.h>
    #include<algorithm>
    #include<string>
    using namespace std ;
    
    #define LL long long
    #define MAXN 200010
    
    struct item
    {
        int a,b,w;
    }it[MAXN];
    bool cmp(item a, item b)
    {
        return a.w>b.w;
    }
    
    int main()
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=0;i<n;i++)
            scanf("%d",&it[i].a);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&it[i].b);
            it[i].w=it[i].b-it[i].a;
        }
        sort(it,it+n,cmp);
        int ans=0;
        for(int i=0;i<n;i++)
        {
            if(i<k)
            {
                ans=ans+it[i].a;
            }
            else if(it[i].w>0)
                ans=ans+it[i].a;
            else
                ans=ans+it[i].b;
        }
        printf("%d
    ",ans);
        return 0;
    }
    View Code
  • 相关阅读:
    Linux 重启命令
    Linux TCP连接数修改
    Linux 命令--查看物理CPU个数、核数、逻辑CPU个数
    keepalived配置文件
    keepalived 安装配置
    linux下keepalived 安装配置
    redis主从切换的集群管理
    CentOS_5.6下使用cmake编译MySQL_5.5.11
    cas错误:org.jasig.cas.client.validation.TicketValidationException: No principal was found in the response from the CAS server.
    完美实现在同一个页面中使用不同样式的artDialog样式
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/6483982.html
Copyright © 2011-2022 走看看