NOJ2102 帅神妹纸的生日礼物(双指针)

帅神妹纸的生日礼物

时间限制(普通/Java) :  1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 427            测试通过 : 41 

比赛描述

    A协大牛帅神的妹纸最近又要过生日了,然而妹纸心里早已有一个想要的礼物,妹纸想要的礼物就是10种稀有的钻石,帅神为了满足妹纸的要求,四处打探知道了钻石在一个神秘的地方,这个地方有很多神,所有神灵站成一排,每个神手上有一种钻石,然而懒虫帅神为了少走路,想着尽可能少的访问相邻神,从他们手中获得钻石,已知妹纸对于每种钻石需求的数量多少,求问帅神需要最少访问多少连续的神才可以获得妹纸需要钻石。




输入

本题为多组样例,第一行输入一个整数t(t <= 100),表示样例个数,对于每组样例,

第一行为一个由0-9数字组成的字符串组成(长度小于100,000),表示站成一排的神灵,每种数字代表该神拥有几号钻石

第二行为10个数字,分别表示妹纸需要的0-9号钻石是多少


输出

每组样例输出一个数字,表示最少访问多少个连续的神可以满足妹纸需求,如果无法满足,输出"Let's break up"。



样例输入

2
1234567890
0 0 0 1 1 0 1 0 0 0
1234567890
2 0 0 0 0 0 0 0 0 0

样例输出

4
Let's break up



题目链接:点击打开链接

双指针法, 记录出现的次数, 尾指针向后移, 头指针跟着, 动态更新数量, 记录最小长度.

AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
#define st first
#define nd second
#define exp 1e-8
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5 + 5;
int t, n, need[15], has[15];
char s[MAXN];
bool Judge()
{
    for(int i = 0; i < 10; ++i)
        if(has[i] < need[i]) return false;
    return true;
}
int main(int argc, char const *argv[])
{
    scanf("%d", &t);
    while(t--) {
        memset(has, 0, sizeof(has));
        scanf("%s", s);
        for(int i = 0; i < 10; ++i)
            scanf("%d", &need[i]);
        int st = 0, ed = 0, ans = INF, len = strlen(s);
        while(ed < len) {
            while(!Judge() && ed < len) {
                has[s[ed] - '0']++;
                ed++;
            }
            while(Judge() && st < ed) {
                ans = min(ans, ed - st);
                has[s[st] - '0']--;
                st++;
            }
        }
        if(ans == INF) printf("Let's break up\n");
        else printf("%d\n", ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值