乙级|1039.到底买不买

题目描述

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。
为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图1中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。

输入描述

每个输入包含1个测试用例。每个测试用例分别在2行中先后给出摊主的珠串和小红想做的珠串,两串都不超过1000个珠子。

输出描述

如果可以买,则在一行中输出“Yes”以及有多少多余的珠子;如果不可以买,则在一行中输出“No”以及缺了多少珠子。其间以1个空格分隔。

输入例子

ppRYYGrrYBR2258
YrR8RrY

输出例子

Yes 8

我的代码

#include<stdio.h>
#include<string.h>
int main(){
   char a[1001],b[1001];
   int len1,len2,i,j,c[62]={0},d[62]={0},t=0,sum=0,m;
   
   while(scanf("%s %s",a,b) != EOF){
   len1=strlen(a);
   len2=strlen(b);
   
   for(i=0;i<len1;i++){   //先统计提供的串串 
       if(a[i]>=0+'0'&&a[i]<=9+'0'){   //在[0,9]存储数字字符 
           for(j=0;j<=9;j++){
               if(a[i]-'0'==j){
                   c[j]++;
               }
           }
       }
       if(a[i]>=97&&a[i]<=122){   //在[10,35]统计小写字母字符 
           for(j=10;j<=35;j++){
               if((int)a[i]-j==87){   //转换成码 
                   c[j]++;
               }
           }
       }
       if(a[i]>=65&&a[i]<=90){   //在[36,61]统计大写字母 
           for(j=36;j<=61;j++){
               if((int)a[i]-j==29){
                   c[j]++;
               }
           }
       }
   }
   
   
   for(i=0;i<len2;i++){     //然后是需要的串串 
           if(b[i]>=0+'0'&&b[i]<=9+'0'){
           for(j=0;j<=9;j++){
               if(b[i]-'0'==j){
                   d[j]++;
               }
           }
       }
       if(b[i]>=97&&b[i]<=122){
           for(j=10;j<=35;j++){
               if((int)b[i]-j==87){
                   d[j]++;
               }
           }
       }
       
       if(b[i]>=65&&b[i]<=90){
           for(j=36;j<=61;j++){
               if((int)b[i]-j==29){
                   d[j]++;
               }
           }
       }
   }
   
   
   for(i=0;i<62;i++){   //满足的情况 
       if(c[i]-d[i]>=0){
           t++;
           if(t==62){
               printf("Yes %d\n",len1-len2);
               m=1;    //如果满足,则让m=1    
           }
               }   
       }
       
       if(m!=1){   //如果m不等于1,则是输出不满足的情况 
           for(i=0;i<62;i++){
           if((c[i]!=0&&d[i]!=0&&c[i]<d[i])||(c[i]==0&&d[i]!=0)){
               sum=sum+d[i]-c[i];    //计算缺少的珠子数量 
               }
         }
         printf("No %d\n",sum);
     }
}
   return 0;
       
} 

我的分析

这道题开始的时候是想到比较麻烦的方法,后来发现算法太难实现了。然后多读了几遍题目,就想到了比较“蠢”的方法,虽然看起来多,但是很容易就能够实现:就是把[0,Z]这62个珠子的数量分别存储在一个大小为62的数组里面,然后用循环分别统计给出的珠子和所需要的珠子中每一个珠子的数量,然后就可以来判断是否能够满足。

我的代码(2)

#include<stdio.h>
#include<string.h>
int main(){
    char a[1001],b[1001];
    int len1,len2,i,j,m=0,n=0;
    scanf("%s",a);
    scanf("%s",b);
    len1=strlen(a);
    len2=strlen(b);
    
    for(i=0;i<len2;i++){
        for(j=0;j<len1;j++){
            if(b[i]==a[j]){
                b[i]='*';
                a[j]='*';
                continue;
            }
        }
    }
    
    for(i=0;i<len1;i++){
        if(a[i]!='*'){
            m++;
        }
    }
    for(i=0;i<len2;i++){
        if(b[i]!='*'){
            n++;
        }
    }
    
    if(n==0){
        printf("Yes %d",m);
    }
    else{
        printf("No %d",n);
    }
    return 0;
} 

我的分析(2)

这是后来想到的一个更简单的方法,就是用两个循环来寻找给出的串串中是否有我们需要的,如果有,就把这个字符变为‘’,之后再根据‘’的数量来判断是否满足。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容