网易互娱笔试计算积分问题

游戏积分问题,,,后来绕了好几个小时,终于绕出来了,但是只测试过给的一个测试用例,其他没测过,所以不确定是不是完全对 。

输入:

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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值