IDENTITY V

这篇文章描述了一个关于游戏IDENTITYV(第五人格)的编程挑战。玩家Yuki需积累角色的演绎积分以兑换动态头像。程序需要处理多组数据,根据玩家每天的对战和积分,判断Yuki最终能获得哪个角色的头像。示例输入和输出展示了如何处理这种情况,包括处理新角色和积分累加的逻辑。
摘要由CSDN通过智能技术生成

题目描述

Yuki最近迷上了一款叫作IDENTITY V(第五人格)的游戏,六一节快到了,游戏也推出了一个活动。在活动期间,使用不同的角色参与对战,根据玩家在该局游戏中的表现会给予该角色相应的演绎积分,当演绎积分到达2000时,可以兑换相应角色的动态头像。该游戏现有的典型角色如下:

Yuki十分想要得到动态头像,每个玩家只能获得一个角色的动态头像,如果某一角色的积分足够,他会立即兑换。请根据Yuki在活动期间的对战情况,看看Yuki能够得到哪个角色的头像。

输入

第一行输入一个数T(T≤7),表示Yuki玩这个游戏的天数。接下来是T组数据。

每组数据的第一行是一个整数n(n≤20),表示当天玩的局数,接下来是n行数据,每行数据中包含一个字符串s(长度不超过20)代表Yuki当局使用的角色和一个整数g(g<1000)表示Yuki获得的演绎值。

输出

如果Yuki能够获得某一角色的所有奖励,则将该角色输出;如果不能获得任何角色的奖励,则输出“NOTHING”(不包含引号)

样例输入

【测试样例1】
5
2
Doctor 500
Gardener 600
2
Doctor 500
Gardener 600
3
Machinist 600
Doctor 500
Machinist 800
1
Doctor 500
1
Machinist 800

【测试样例2,请注意这一组的角色名称】
3 
2
ZXY 900
YWH 500
1
CXW 400
1
WSY 600

样例输出

【测试样例1】
Doctor

【测试样例2】
NOTHING

吐槽:这题真的真的出生啊!!!本人没玩过第五人格,不清楚它里面到底有哪些角色,我一遍把题目看下来后觉得它是挺简单的,但是交了好几次都是部分错误,后面终于发现题目给出的12个角色只是例子啊!!除了这12个之外还有无数个角色,也就是说,就算你输个shit进去并且达到2000积分的话,shit也是要输出的,真的是shit啊!!

上思路:

这边先定义3个数组,它们的作用已经在注释说明了。

char characters[100][20] = { 0 };//这是角色库
int Score[100] = { 0 };//这是每个角色对应获取的分数

然后每次输入角色名(c)和积分(score)时,先判断这个角色在角色库里面有没有存在。

char c[20] = { 0 };
int score;
scanf("%s %d", &c, &score);
int which = isbeing(c, role_count);
int isbeing(char* c, int role_count) {
	for (int i = 0; i < role_count; i++) {
		if (strcmp(characters[i], c) == 0)
			return i;//返回的i代表这是角色库里的第几个角色
	}
	return -1;
}//这个函数用来判断输入的角色在角色库中是否存在

这边是准备了一个isbeing函数,把输入的字符串(角色名字)和当前角色库里的角色数量(role_count初始化为0)传过去

通过for循环遍历查找被传过来的角色名字在角色库里有没有一样的,有就返回它的下标(这里是i),方便后面在Score(积分库)里计算对应的积分,因为这样积分库Score的下标和角色库characters的下标都是一一对应的。

显然,无论你第一个输入的角色是谁,它都在角色库里不存在,所以第一次一定返回-1(如果不存在的情况是返回0的话,这个0到底是代表角色库里的第一个角色呢,还是不存在呢?就混淆了,所以这里不存在必须是设计成返回-1的)

然后小小地提一嘴这个char* c,它是函数isbeing的形参,因为c是一个数组(我用来存放每次输入的角色名字,所以传参时c因为是数组名字也就是数组首元素地址,地址当然要用指针变量来接受,所以char* c是指向数组c首元素地址的指针,当然你要是不熟悉指针的话也可以写成char c[20],20是角色名限制的长度)。

①角色不存在的情况:

	else {//不在角色库:对应分数先加上,然后添加到角色库,role_count也就是角色数量加一
				Score[role_count] += score;
				strcpy(characters[role_count], c);
				role_count++;
			}

不存在的角色就添加到角色库里,并且对应的分数也要给加上,然后累计一下角色数量。

因为role_count是初始化成0的,所以第一个新角色放在角色库(characters)的第一个位置(因为下标为0),然后role_count++,所以下一个新角色就该放在角色库的第二个位置,以此类推,很符合预期也很方便吧!

这里的要点应该就是字符串拷贝了,字符串是不能简单地用“=”来赋给其它数组的!请用strcpy完成拷贝,因此还要注意引上头文件#include<string.h>

②角色存在的情况:

	if (which != -1) {//输入的角色已经在角色库:加上对应分数
				Score[which] += score;
				if (Score[which] >= 2000) {
					printf("%s", characters[which]);
					return 0;
				}
			}

存在就正常加上积分嘛,然后写个条件判断,当某个角色积分到2000档位了,立即输出这个角色名并结束程序,注意积分库Score的下标和角色库characters的下标都是一一对应的。

这里可能会产生的疑问是:一旦有角色达到2000积分档位就直接结束,这样可以吗?后面还有角色的积分不算了嘛?

我的回答是反正题目没有要求你计算各角色的总积分,早点结束早点省事吧,多少能降低一点程序的时间复杂度嘞。

完整代码:

#include <stdio.h>
#include <string.h>
char characters[100][20] = { 0 };//这是角色库
int Score[100] = { 0 };//这是每个角色对应获取的分数

int isbeing(char* c, int role_count) {
	for (int i = 0; i < role_count; i++) {
		if (strcmp(characters[i], c) == 0)
			return i;//返回的i代表这是角色库里的第几个角色
	}
	return -1;
}//这个函数用来判断输入的角色在角色库中是否存在
int main()
{
	int i, j, role_count = 0;
	int T, n;
	scanf("%d", &T);
	for (i = 0; i < T; i++) {
		scanf("%d", &n);
		for (j = 0; j < n; j++){
			char c[20] = { 0 };
			int score;
			scanf("%s %d", &c, &score);
			int which = isbeing(c, role_count);
			if (which != -1) {//输入的角色已经在角色库:加上对应分数
				Score[which] += score;
				if (Score[which] >= 2000) {
					printf("%s", characters[which]);
					return 0;
				}
			}
			else {//不在角色库:对应分数先加上,然后添加到角色库,role_count也就是角色数量加一
				Score[role_count] += score;
				strcpy(characters[role_count], c);
				role_count++;
			}
		}
	}
	printf("NOTHING");
	return 0;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值