2020.03.08测试题3

题目

2018年11月3日,万众瞩目的英雄联盟S8世界赛总决赛在韩国仁川开打,8年来第一次同组两支战队在总决赛争夺冠军,IG和FNC的对决引玩家期待。最终S8世界赛冠军诞生!IG3:0击溃FNC拿下胜利!中国LOL拿下世界冠军!
2020.03.08测试题3_第1张图片
ACM-ICPC实验室的成员得知消息后激动不已,决定自己开发一款游戏——ZZU联盟。小J是负责每场比赛后MVP评选模块设计的,如何根据每个队员在游戏中的表现,评选出当场的MVP难住了他,需要你来帮忙。在真实的LOL游戏中,MVP的评选涉及伤害输出、承受伤害与死亡比、平均每分钟获得金钱、对塔伤害 10%、大小龙及野怪的控制、对敌方的控制时间 2.5%、技能躲闪与命中、多杀、连杀、团队装与团队贡献(团战效率比)、支援效率(参团率)、所用英雄位置与熟练度预期(游戏默认)、KDA(击杀Kill、死亡Death、助攻Assist)等等好多因素。而ZZU联盟在其第一个版本中,决定先不考虑那么复杂,采用的评选指标如下:
(1)伤害输出值 Dps (0 =< Dps <= 50000)
(2)累计获得金钱数 M (0 =< M <= 30000)
(3)对塔伤害 Tow (0 =< Tow <= 10000)
(4)支援率 S (0 =< S <= 100)
(5)击杀K、死亡D、助攻A (0 =< K, D, A <= 30)
其中,每个值都为整数。
最终,对于每个选手都有一个MVP候选值(双精度实数)
V = Dps/50000 + M / 30000 + Tow / 10000 + S / 100 + (K + A) / (D+1)
而MVP获得者是获胜方中V值最大的玩家,数据保证每场比赛的MVP是唯一的。
输入格式:
第一行一个整数T(1= 对于每组测试数据来说,
第一行, win/lose,表示蓝色军团获胜/失败 接下来5行,分别为5名玩家的赛后指标统计值,其中每一行的格式都为
玩家ID Dps M Tow S K D A(玩家ID字符长度不超过20,所有内容全用空格隔开)
紧接着一行为win/lose,表示紫色军团获胜/失败
接下来5行同样为紫色军团中5名玩家的战绩,格式同样为
玩家ID Dps M Tow S K D A
输出格式:
T行,对于每组测试数据,输出该场比赛Mvp选手的玩家ID

输入样例:
2
win
zxy 23197 13453 8636 61 6 3 3
fxr 12155 9854 8769 57 2 4 10
sgl 21232 23717 5215 67 24 23 25
cy 8268 201 3151 21 0 27 8
lzh 22306 15051 6246 54 22 28 5
lose
chj 16800 14340 4185 90 19 20 23
cwc 2646 1759 6548 60 0 7 5
wjk 11467 951 9615 52 4 16 11
lmc 29038 11256 173 64 8 3 3
lx 4686 11291 2677 77 16 26 22
lose
lzl 7670 14713 4174 42 6 23 7
gy 13955 5514 5087 91 15 29 4
sq 253 4773 7454 13 9 6 1
gxb 32055 7682 6093 83 16 7 26
gxh 24687 12611 3652 70 10 25 29
win
zyj 5074 12640 1414 64 29 8 6
hzy 23484 20429 6293 54 22 16 2
hzp 14823 20893 448 58 9 9 10
sjf 13059 6451 2344 72 5 13 17
tjt 26347 13267 5171 46 6 23 15

输出样例:
zxy
zyj

代码展示

#include
#include
int main()
{
	char a[5],id[10][200],put[500][20];
	int dps,m,tow,s,k,d,A,t,j=0,temp=0,count=0;
	double v[5];
	scanf("%d",&t);
	for(int i=0;i<2*t;i++)
	{
		 temp=0;
		scanf("%s",a);
		for(j=0;j<5;j++)
		{
		scanf("%s%d%d%d%d%d%d%d",id[j],&dps,&m,&tow,&s,&k,&d,&A);
		v[j]=dps/50000.0+m/30000.0+tow/10000.0+s/100.0+(double)(k+A)/(double)(d+1);	
			if(v[temp]<v[j])
				temp=j;	
		}
		if(a[0]=='w')
		{
			strcpy(put[count],id[temp]);
			count++;
		}
	}
	for(j=0;j<t;++j)
		printf("%s\n",put[j]);				
	return 0;
} 

思路分析

1、首先,由题目分析得:每组数据包含win和lose两队数据,每组数据中只会输出win队中的成员为MVP,判定MVP条件遵循题中的判定条件。
2、在进行输入时,首先输入整形数n,判定有几组数据,因此,有两种选择,第一种:创建两个一位数组来分别储存win/lose,=;两个二维数组,分别储存每队五位成员的成绩,进行n次循环,输出win的MVP;但是,为了减少内存,不妨使用第二种方法,增加循环次数为2n,只定义一个一位数组和二维数组,分别储存win/lose,五名队员的成绩,计算得到每个队伍中按照MVP计算方法的最优成员,判断队伍是否为win而进行输出或pass。
(对于为何先计算后输出,在我看来,每组数据都需要进行输入,因此不可能先判断win/false而先去判断是否pass,但是可以通过win/false来判定是否进入MVP的操作,可以尝试先判断win/false,输入数据后选择是否进入MVP计算)
3、对于win/false的判断,只需要判断记录的一位数组的v[0]即可,而在规定MVP计算式时,需要考虑数据的类型,必要时需要进行强制数据类型转换,一段代码如下:

scanf("%s%d%d%d%d%d%d%d",id[j],&dps,&m,&tow,&s,&k,&d,&A);
		v[j]=dps/50000.0+m/30000.0+tow/10000.0+s/100.0+(double)(k+A)/(double)(d+1);	

4、为了满足题目中输出的要求以及循环结构的限制,我们需要把每次判断出的MVP进行储存,最终一并输出。因此我们选择了库函数中的string的函数中的strcpy函数,用于将win队中的MVP的成员名称复制到put[](输出)数组中,从而完成下一步输出MVP的操作。

if(a[0]=='w')
		{
			strcpy(put[count],id[temp]);
			count++;
		}

你可能感兴趣的:(C语言每周测试,c语言)