游戏积分问题,,,后来绕了好几个小时,终于绕出来了,但是只测试过给的一个测试用例,其他没测过,所以不确定是不是完全对 。
输入:
2
10 6 3
1 1 300
2 2 250
3 3 200
4 5 100
6 8 50
9 10 10
10 50 100 150
5 1
0 Apple Ball
1 Cat Dog
2 Elephane Fish
5 Gorilla Hat
8 Igloo Juice
10 Cat Cat
10 Elephane Igloo
15 Gorilla Elephane
20 Apple Gorilla
10 4 4
6 10 10
4 5 20
2 3 25
1 1 30
1 5 10 15 30
2 50
5 Apple apple
15 appleApple Apple
18 Gorilla Fish
20 Gorilla Hat
20 Igloo Juice
30 Gorilla appleApple
40 Elephane Igloo
55 Gorilla Elephane
60 Appleapple Gorilla
输出:
Apple 511
Ball 11
Cat 161
Dog 16
Elephane 336
Fish 61
Gorilla 461
Hat 76
Igloo 161
Juice 91
Apple 91
Appleapple 230
Elephane 190
Fish 96
Gorilla 207
Hat 100
Igloo 151
Juice 100
apple 70
appleApple 135
代码部分:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <map>
using namespace std;
typedef struct timetokill{
int time;
string killer;
string victim;
}timetokill;
int main(){
int A,B,T,Q,M,N;
int left,right,rank_score;
int RankS[101]={0};
cin>>T;
while(T--){
cin>>Q>>N>>M;//Q-player,N-rank scores,M-murder scores
for(int i=0;i<N;i++){
cin>>left>>right>>rank_score;
while(right-left>0){
RankS[right--]=rank_score;
}
RankS[left]=rank_score;
}
int MurderS[101]={0};
int j=0;
for(int i=0;i<M+1;i++){
cin>>MurderS[i];
// cout<<i<<"="<<MurderS[i]<<endl;
}
cin>>A>>B;//生存系数
//struct timetokill *ttl=(struct timetokill*)malloc(sizeof(struct timetokill)*Q);
struct timetokill ttl[120];
for(int i=0;i<Q-1;i++){
cin>>ttl[i].time>>ttl[i].killer>>ttl[i].victim;
}
map<string,int> playerScores;
map<string,int> killcount;
map<string,int> killscore;
map<string,int>::iterator it;
int t;string killname;string victimname;
for(int i=0;i<Q-1;i++){
t=ttl[i].time;
killname=ttl[i].killer;
victimname=ttl[i].victim;
it=killcount.find(killname);
if(it==killcount.end()){//这个杀手是第一次杀人
killcount.insert(pair<string,int>(killname,1));
killscore.insert(pair<string,int>(killname,0));
}
else killcount[killname]++;
it=killcount.find(victimname);
if(it==killcount.end()){//被杀之人没杀过人
killcount.insert(pair<string,int>(victimname,0));
killscore[victimname]=0;
killscore[killname]+=MurderS[0];//被杀的人没杀过人,所以是murderS[0]
playerScores.insert(pair<string,int>(victimname,RankS[Q-i] + t*A + B));
}
else {
if(killname!=victimname){
if(killcount[victimname]<M)killscore[killname]+=MurderS[killcount[victimname]];//杀手的击杀积分=自己的积分加上被杀的人的杀人数目对应的积分
else killscore[killname]=MurderS[killcount[victimname]];
}
else killscore[killname]+=0;
playerScores.insert(pair<string,int>(victimname,killscore[victimname]+RankS[Q-i] + t*A + B));
}
if(i==Q-1-1)playerScores.insert(pair<string,int>(killname,killscore[killname]+RankS[1] + t*A + B));
}
for(it=playerScores.begin();it!=playerScores.end();++it){
cout<<it->first<<" "<<it->second<<endl;
}
playerScores.erase(playerScores.begin(),playerScores.end());
}
return 0;
}