帅神妹纸的生日礼物
时间限制(普通/Java) :
1000 MS/ 3000 MS 运行内存限制 : 65536 KByte
总提交 : 427 测试通过 : 41
总提交 : 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;
}