【PAT1092】To Buy or Not to Buy

本文介绍了一个珠子匹配算法,该算法用于确定商店的珠子串是否包含顾客所需的所有颜色珠子,并计算额外购买或缺失的珠子数量。通过将珠子颜色序列存储在map中,算法比较了商店和顾客需求的珠子颜色及数量,从而得出是否满足需求及具体数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

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<stdio.h>
#include<iostream>
#include<string>
#include<vector>
#include<map>
using namespace std;


int main() {
    string whole, needs;
    cin >> whole>> needs;
    map<char, int> dic;
    map<char, int> 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<int, int>(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<int, int>(whole[i], 1));
        }
    }
    map<char, int>::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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值