题意说The Great Sultan Mahbub这家伙有健忘症,今天看到的人,k天内碰到还能认识,k天以后就忘记了。给定n个人和k天,以及n个人的名字字符串(每个人的人名是以单个字母的大写形式表示),求每组测试数据,这家伙能认出多少人。
简单题,设置一个名字的整形数组用于记录:
- 每读入一个名字,数组相应位置+k;
- 每天每个名字的数值-1。
要判断是否认识这个人,只需要在每次读入名字时,判断数组对应位置是否大于0,如果是,表示还认识,否则就是遗忘了。
python版本代码:
name = [0 for i in range(26)]
testcase = int(input())
for i in range(testcase+1):
if i == 0:
continue
name = [0 for i in range(26)]
n,k,namelist = input().split()
n = int(n)
k = int(k)
cnt = 0
for j in range(n):
nid = ord(namelist[j]) - ord('A')
if name[nid] > 0:
cnt += 1
for l in range(26):
name[l] -= 1
name[nid] = k
print("Case %d: %d" %(i,cnt))
C++版本代码
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
//#define ZANGFONG
int name[26];
char s[510];
int main()
{
#ifdef ZANGFONG
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif // ZANGFONG
int testcase, n,k,i,j,l;
int cnt,id;
scanf("%d\n",&testcase);
for(i = 1; i <= testcase; i++)
{
memset(name,0,sizeof(name));
memset(s,0,sizeof(s));
scanf("%d%d%s\n",&n, &k, s);
cnt = 0;
for(j = 0; j < n; j++)
{
id = s[j] - 'A';
if(name[id] > 0) cnt++;
for(l = 0; l < 26; l++) name[l]--;
name[id] = k;
}
printf("Case %d: %d\n",i,cnt);
}
return 0;
}