uva12583 Memory Overflow

本文介绍了一道UVA12583的编程题目,通过使用一个整形数组来记录每个人物在特定天数内的记忆状态。算法在读入每个人名时更新数组,并判断是否仍处于记忆期内,以此计算出总的认识人数。提供了Python和C++两种实现方式。

uva12583

uDebug12583

题意说The Great Sultan Mahbub这家伙有健忘症,今天看到的人,k天内碰到还能认识,k天以后就忘记了。给定n个人和k天,以及n个人的名字字符串(每个人的人名是以单个字母的大写形式表示),求每组测试数据,这家伙能认出多少人。

简单题,设置一个名字的整形数组用于记录:

  1. 每读入一个名字,数组相应位置+k;
  2. 每天每个名字的数值-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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值