PAT题目 1004 To Buy or Not to Buy - Hard Version

该博客介绍了一道PAT算法题,涉及珠子串的购买问题。通过深度搜索商店珠子串,利用ASCII码进行比较,初始化需求珠子计数,动态更新需求状态并进行回退操作。博主分享了实现思路和代码片段,包括满足条件的判断、额外珠子计数以及剪枝策略。
摘要由CSDN通过智能技术生成

题目地址:https://pintia.cn/problem-sets/994805148990160896/problems/994805155206119424

中文题目:
有一种不同颜色的珠子,可以串成一串,你想要一些珠子,需要去商店买,但是商店的珠子都是一串一串卖,你看中一个珠子,就要把整串都买下来。
你要从商店里面买珠子串,来凑成自己想要的珠子。如果商店能买到你想要的所有珠子,那么输出Yes,并输出你额外购买的珠子数;如果不能买到,那就输出No,并输出还差的珠子数
用26个大写字母,26个小写字母,0-9个数字,各表示不同的颜色的珠子。先输入一行你要的珠子串,再输入一行数字n,然后跟上n行,是商店所有的珠子串。

样例1:

输入:

RYg5
8
gY5Ybf
8R5
12346789
gRg8h
5Y37
pRgYgbR52
8Y
8g

输出:

Yes 3

样例2
输入:

YrRR8RRrY
3
ppRGrrYB225
8ppGrrB25
Zd6KrY

输出;

No 3

题解:

搜索: 深度搜索商店珠子串,将该珠子串加进来,如果收集到了所需要的所有珠子,则记录下来。

比较: 与想要的珠子作比较,不需要遍历它,只需要一个256长度的数组。数字,字母的ascii码都在256以内,把每个想要的珠子设为1,不想要的珠子设为0,在比较时,只要它为1,就是想要的珠子了。

初始化:还需要一个256长度的数组,假如需要2个珠子a,那么把 数组[a] 设置为2。也就是,如果需要n个这种珠子,就把它设置为n,如果不需要,就设为0.

加入: 搜索时,如果要把一个珠子加入,那么就在把刚初始化的数组里面,相应的数减一。

满足: 想知道是否已有所有需要的珠子,不需要遍历它,只要一个数值变量,初始化时,它是所有需要珠子的数字总和,每次加入一个珠子,如果该珠子是所需珠子,而且初始化的数组里它大于0,那么这个数值变量减一,当变量为0时,它就不能再减了,这时,说明所有需要的珠子都得到了。

回退: 加入珠子串后,如果不想要了,就要把它回退掉。先前初始化的数组里,要把这个珠子加一,如果加一之后大于0,那么判断满足的变量,也要加一。

额外: 在满足的时候,我们要查看额外的珠子数,并记录下最小的额外数。我们要用一个变量,每次加入额外珠子时,就加一,每次回退额外珠子时,就减一。

欠缺: 当拿了商店所有珠子串后,还不能满足时,就要输出缺少多少珠子,先前那个用来判断是否满足的数值变量,就是答案。

剪枝: 第一次深度搜索时,如果没有满足,会搜索商店里所有的珠子串,这时,就说明这个商店满足不了我们,我们可以直接输出no了。

最后放上我凌乱不堪的代码

#include <iostream>
using namespace std;
 

int HashTable[301];
int TargetTable[301];
char target[1001];
char goods[100][1001];
int goodsnum=0;
int count=0;
int neg=0;
int minCount=999999
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值