PAT乙级1039

193 阅读2分钟

题目

小红想买些珠子做一串自己喜欢的珠串。卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖。于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子。

为方便起见,我们用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色。例如在图中,第3串是小红想做的珠串;那么第1串可以买,因为包含了全部她想要的珠子,还多了8颗不需要的珠子;第2串不能买,因为没有黑色珠子,并且少了一颗红色的珠子。

image.png

输入格式

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

输出格式

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

思路

差不多还是桶排序的思维,将店家有的和小红想要的各个珠子种类数量分别存在两个数组中。因为用[0-9]、[a-z]、[A-Z]范围内的字符来表示颜色,那么只需要开62位置的数组作为桶便可以装下了。 [数字存在count数组的前十位小写字母存在count数组的1135位大写字母存在cout数组的3662位]
然后遍历0~62找一找够还是不够,有一个不够就开始统计差了几个,不然就在最后输出s1,s2的长度差值。

//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
//如果是,那么告诉她有多少多余的珠子;如果不是,那么告诉她缺了多少珠子

string s1,s2;
int cnt;
int count1[100],count2[100];//也可以开的很大,这样后面可以全部直接存入,不需 -'0'等操作

//统计各个字符数字出现的次数
void countSize(string s,int count[]){
    int len = s.size();
    for(int i = 0;i < len; i++){
        if(s[i] - '0' >= 0 && s[i] - '9' <= 0)
			count[s[i] - '0']++;//数字存在count数组的前十位
	    else if (s[i] - 'a' >= 0 && s[i] - 'z' <= 0)
			count[s[i] - 'a' + 10]++;//小写字母存在count数组的11~35位
		else
			count[s[i] - 'A' + 36]++;//大写字母存在cout数组的36~62位
    }
}

int main() {
    cin >> s1 >> s2;
    bool flag = 1;//1代表可以,否则为0
    countSize(s1,count1);
    countSize(s2,count2);

    for(int i = 0; i < 62; i++){
        if(count2[i] != 0 && count2[i] > count1[i]){
            cnt += count2[i] - count1[i];
            flag = 0;
        }
    }
    if(!flag){
        cout << "No " << cnt << endl;
    }
    else{
        int len = s1.size() - s2.size();
        cout << "Yes " << len << endl;
    }

    return 0;
}

你觉得这样太麻烦,不想去转化,也可以只开一个很大的数组,至少比Z的编码大,将店家的s1存入,再遍历小红的需求s2,找够还是不够。

//foreverking
#include <vector>
#include <cstdio>
#include <queue>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;


string s1,s2;
int count1[300];
int cnt;

int main(){
    cin >> s1 >> s2;
    //店家的存入
    for (int i = 0; i < s1.length(); i++)
        count1[s1[i]]++;
    
    for(int i = 0; i < s2.size(); i++){
        if(count1[s2[i]] > 0)
            count1[s2[i]]--;//店家有这个珠子,减去一颗
        else
            cnt++;//店家没有,那么统计一下不够的
    }
    if(!cnt){
        int len = s1.size() - s2.size();
        cout << "Yes " << len << endl;
    }
    else
        cout << "No " << cnt << endl;

    return 0;
}

题目链接