首页 > 代码库 > codeforces 779

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\n");
    else
    {
        int ans=0;
        for(int i=1;i<=5;i++)
        {
            if(s1[i]<s2[i])
            {
               // printf("%d %d %d\n",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\n",s1[i],s2[i],ans);
                int j=i+1;
                    while(a>0)
                    {
                        while(s1[j]>s2[j]&&a>0)
                        {
                            a--;
                            //printf("%d\n",a);
                            // printf("%d %d\n",s1[j],s2[j]);
                            s1[j]--;
                            s2[j]++;
                           // printf("%d %d\n",s1[j],s2[j]);
                        }
                        j++;
                    }
            }
            else if(s1[i]>s2[i])
            {
               // printf("%d %d %d\n",s1[i],s2[i],ans);
                int a=(s1[i]-s2[i])/2;
                ans=ans+a;
                s1[i]=s2[i]=s2[i]+a;
               // printf("%d\n",ans);
                int j=i+1;
                    while(a>0)
                    {
                        while(s1[j]<s2[j]&&a>0)
                        {
                            a--;
                            s2[j]--;
                            s1[j]++;
                        }
                        j++;
                    }
            }
        }
        printf("%d\n",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\n");
    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\n",cnt);
        else
        {
            printf("%d\n",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\n",ans);
    return 0;
}
View Code

 

codeforces 779