【PAT_1062】To Buy or Not to Buy

问题描述

eva想用她最喜欢的颜色做一串珠子,她去了一家小店买了一些珠子。 有许多五颜六色的珠子串。 然而,商店只会将整个珠子串出售。 因此,伊娃必须检查商店中的字符串是否包含她需要的所有珠子。 她现在来找你帮忙:如果答案是“是”,请告诉她额外的数量必须买的珠子; 或者如果答案是“否”,请告诉她字符串中缺少的珠子数量。 为简单起见,让我们使用范围中的字符
[0-9],[a-z]和[A-Z]代表颜色。

输入:

第一行:商店的珠子串的颜色序列whole
第二行:eva所需要的珠子的颜色序列needs

输出:

如果答案是“是”,那么还输出Eva必须购买的额外珠子的数量;
即Yes 额外珠子数量
如果答案为“否”,则还输出字符串中缺少的珠子数less。
即No 缺少的珠子数。
答案和号码之间必须有1个空格。

解题思路:

将商店的序列和需要的序列分布都存在一个map中,得出每个序列中<颜色(key),颜色数(val)>
对于need_map中的每一种颜色key,判断whole_map中的key的val是否小于于need_map中的val,小于则答案为否,less += whole_val-need_val;
遍历完之后如果less>=0,则能满足条件,额外多买的珠子为whole.size()-need.size();

代码

#include
#include
#include
#include
#include
using namespace std;


int main() {
    string whole, needs;
    cin >> whole>> needs;
    map dic;
    map whole_dic;
    int less = 0;
    for (int i = 0; i < needs.size(); i++) {//需要的序列存入map中
        if (dic.find(needs[i]) != dic.end()) {
            dic[needs[i]]= dic[needs[i]] +1;
        }
        else {
            dic.insert(pair(needs[i], 1));
        }
    }
    for (int i = 0; i < whole.size(); i++) {//售出的序列存入map
        if (whole_dic.find(whole[i]) != whole_dic.end()) {
            whole_dic[whole[i]] = whole_dic[whole[i]] + 1;
        }
        else {
            whole_dic.insert(pair(whole[i], 1));
        }
    }
    map::iterator it;
    it = dic.begin();
    while (it != dic.end())
    {
        if (whole_dic.find(it->first) == whole_dic.end()) {//判断商店售卖的某种颜色是否能满足需要的值
            less += it->second;
        }
        else {
            if (whole_dic[it->first] < it->second) {
                less += it->second - whole_dic[it->first];
            }
        }
        it++;
    }
    if (less != 0) {
        cout << "No " << less << endl;
    }
    else {
        cout << "Yes " << (whole.size()-needs.size()) << endl;
    }

    return 0;
}


你可能感兴趣的:(【PAT_1062】To Buy or Not to Buy)