• Codeforces #402


    Codeforces #402

    Codeforces 779A Pupils Redistribution

    链接:http://codeforces.com/contest/779/problem/A

    题意:有A组和B组,每组有n个人,A组里面每个人的分值为(a_i),B组里面每个人的分值为(b_i)(1le a_i ,b_ile5),至少双方要交换多少人才能使使A组里面每种分值的人要和B组里面一样多。

    思路:如果两个在(i)这个分值上面人数之差为奇数,就不行,如果为偶数,假如A比B多,那么要A跟B交换差的一半,如果B的在(j)这个分值上面比A多,那么刚好就可以跟(i)这个分值的交换,所以答案就是他们之间差的一半。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include <iostream>
    using namespace std;
    int cnta[10],cntb[10];
    int main(){
    	int n;
    	while(scanf("%d",&n)!=EOF){
    		memset(cnta,0,sizeof(cnta));
    		memset(cntb,0,sizeof(cntb));
    		int x;
    		for(int i=1;i<=n;i++){
    			scanf("%d",&x);
    			cnta[x]++;
    		}
    		for(int i=1;i<=n;i++){
    			scanf("%d",&x);
    			cntb[x]++;
    		}
    		bool flag=true;
    		int cnt=0;
    		for(int i=1;i<=5;i++){
    			int num=abs(cnta[i]-cntb[i]);
    			if(num>0){
    				if(num%2==1) {
    					flag=false;
    					break;
    				}
    				else cnt+=num/2;
    			}
    		}
    		if(flag){
    			printf("%d
    ",cnt/2);
    		}
    		else {
    			printf("-1
    ");
    		}
    
    	}
    }
    

    Codeforces 779B Weird Rounding

    链接:http://codeforces.com/contest/779/problem/B

    题意:有两个数(n,k),最少要删掉(n)里面多少个数字,才能使得(n)整除(10^k)。30020如果删掉2就为3000,如果为1000,删掉1,为000,全部删掉为0,有多个0要删到只剩1个0才算0。

    思路:贪心,肯定是从后面开始删,每次删完判断一次,不行继续,如果删到只剩下0了但是不止一个0,这个时候就可以直接删掉当前数的位数-1就只剩下一个0了。

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <iostream>
    using namespace std;
    int a[20];
    int cnt;
    long long mod;
    void change(long long tmp){
    	cnt=0;
    	while(tmp){
    		a[cnt++]=tmp%10;
    		tmp/=10;
    	}
    }
    long long changenum(int num[],int len){
    	long long tmp=0;
    	long long dig=1;
    	for(int i=0;i<len;i++){
    		tmp+=num[i]*dig;
    		dig*=10;
    	}
    	return tmp;
    }
    int ans;
    int main(){
    	long long num;
    	int k;
    	while(scanf("%I64d",&num)!=EOF){
    		scanf("%d",&k);
    		mod=1;
    		for(int i=1;i<=k;i++){
    			mod*=10;
    		}
    		ans=0;
    		if(num%mod==0) {
    			printf("0
    ");
    			continue;
    		}
    		else {
    			bool flag=false;
    			while(!flag){
    				if(num==0&&cnt!=1){
    					ans+=(cnt-2);
    				}
    				if(num%mod==0){
    					flag=true;
    					break;
    				}
    				change(num);
    				for(int i=0;i<cnt;i++){
    					if(a[i]!=0){
    						for(int j=i+1;j<cnt;j++){
    							a[j-1]=a[j];
    						}
    						ans++;
    						break;
    					}
    				}
    				num=changenum(a,cnt-1);
    
    		}
    		printf("%d
    ",ans);
    		}
    	}
    	return 0;
    }
    

    Codeforces 779C Dishonest Sellers

    链接:http://codeforces.com/contest/779/problem/C

    题意:有(n)个商品,每个商品有个当前价格(a_i),和一个星期之后的折扣价格(b_i),现在一定要在当前至少买(k)个物品,问怎么样购买才能使买完(n)个商品花费最低

    思路:原价=(a1+...+a_n),折后价=(b_1+...+b_k+...+a_n),原价-折后价=(sum_{i=1}^{k}(a_i-b_i)),所以要想折后价低,就要选择两者差价尽量大的,也就是差价小的买原价。注意如果当折后价比原价贵,那么就可以直接选择原价。

    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    using namespace std;
    const int MAXN=2e5+10;
    int n,k;
    int a[MAXN],b[MAXN];
    bool flag[MAXN];
    struct node{
    	int id;
    	int num;
    };
    node c[MAXN];
    bool cmp(node a,node b){
    	return a.num<b.num;
    }
    int main(){
    	while(scanf("%d %d",&n,&k)!=EOF){
    		memset(flag,false,sizeof(flag));
    		for(int i=1;i<=n;i++){
    			scanf("%d",&a[i]);
    		}
    		for(int i=1;i<=n;i++){
    			scanf("%d",&b[i]);
    		}
    		for(int i=1;i<=n;i++){
    			c[i].num=a[i]-b[i];
    			c[i].id=i;
    			if(c[i].num<=0) flag[c[i].id]=true;
    		}
    		sort(c+1,c+1+n,cmp);
    		long long ans=0;
    		for(int i=1;i<=k;i++) flag[c[i].id]=true;
    			for(int i=1;i<=n;i++){
    				if(!flag[i]) ans+=b[i];
    				else ans+=a[i];
    			}
    			printf("%lld
    ",ans);
    	}
    	return 0;
    }
    

    Codeforces 779D String Game

    链接:http://codeforces.com/contest/779/problem/D

    题意:现在有一个字符串原串(t),有一个模式串(p),现在保证在原串里面删除一些字母,(p)仍然存在于(t)里面(子序列),给出删除的顺序(a_i),问最多能删到哪一步(p)里面还包含(t)

    思路:二分答案,O(n)判定子序列

  • 相关阅读:
    简化SpringBoot框架打包体积
    深究1.8版本HashMap源码
    一次面试题,将 字符串 保存在 Byte 数组中
    记一次linux磁盘清理
    Alibaba Cloud Toolkit 使用心得(IDEA版)
    Mybatis 一对多分页踩坑 对collection的分析
    MySQL中update修改数据与原数据相同会再次执行吗?
    与 MySQL 因“CST” 时区协商误解导致时间差了13 小时
    Druid数据源
    mybatis自动生成代码 mybatis-generator
  • 原文地址:https://www.cnblogs.com/as3asddd/p/6480776.html
Copyright © 2020-2023  润新知