NOJ [1006] DOTA

  • 问题描述
  • DOTA是一个基于魔兽争霸的5V5 RPG地图。它风靡全世界,相信很多同学都玩过,当然没玩过也没有关系。首先简单介绍一下游戏,它的目的是守护自己的远古遗迹(近卫方的生命之树、天灾方的冰封王座),同时摧毁对方的远古遗迹。为了到达对方的远古遗迹,一方英雄必须战胜对方的部队、防御建筑和英雄。我们的问题来了~~~当一个英雄杀死敌方的时候,如果符合某种条件,该英雄就会获得一些称号。我们的要做的就是输出这些称号。

    这里说明一些规则:

    不会杀死友军,但是可以自杀。若自杀了则所有称号中断重新累计。

    第一个杀人的人将获得一个First Blood的称号.

    连续杀人数3个(中间不被击杀即为连续击杀)将获得Killing Spree的称号。以此类推4个为Dominating,5个为Mega Kill,6个为Unstoppable,7个为Wicked Sick

    8个为M-m-m-m...onster Kill,9个为Godlike,10个以上都是Beyond Godlike

    如果每两次杀人间隔10秒包含10秒,连续杀人数为2人,获得称号Double Kill

    以此类推Triple Kill,Ultra Kill,Rampage 对应3,4,5或者5以上。


  • 输入
  • 输入数据按 击杀发生时间顺序先后 给出各队击杀 和 时间
    比如 a kill b in 00:33
    首先输入一个T,代表有几组测试数据
    然后输入一个N,代表击杀事件的个数
    然后输入击杀事件
  • 输出
  • 输入和输出规范详情参考 input和output

    这题WA了很久,原来的写法估计是if 和 else 的逻辑上稍微有点问题,换了种和JJ大神差不多的写法,就过了
    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<iterator>
    using namespace std;
    struct KILL
    {
      int killed; //连续击杀人数
      int pret; //上次杀人的时间
      int frequent; //记录达到时间不足十秒的连续杀人
      KILL()
      {
       killed=0;
       pret=-1000;
       frequent=0;
      }
      void died()
      {
      	killed=0;
      	frequent=0;
      	pret=-1000;
      }
      void chenghao(const char* name,const int cur)
      {
      	if(cur-pret <= 10)
        {
          pret=cur;
          frequent++;
        }
        else  //超过10秒,中断累计          
        {
          pret=cur;
          frequent=1; 
        }        
    	if(frequent == 2)
            printf("%s has Double Kill\n",name);	        	 
        else if(frequent == 3)
            printf("%s has Triple Kill\n",name);               
        else if(frequent == 4)
            printf("%s has Ultra Kill\n",name);      
        else if(frequent >= 5)
            printf("%s has Rampage\n",name);
        killed++;
        if(killed ==3)
            printf("%s is Killing Spree\n", name);
        else if(killed == 4)         
            printf("%s is Dominating\n", name);       
        else if (killed == 5)         
            printf("%s is Mega Kill\n", name);
        else if (killed == 6)
            printf("%s is Unstoppable\n", name);
        else if (killed == 7)
            printf("%s is Wicked Sick\n", name);
        else if (killed == 8)
            printf("%s is M-m-m-m...onster Kill\n", name);
        else if (killed == 9)
            printf("%s is Godlike\n", name);
        else if (killed >= 10)
            printf("%s is Beyond Godlike\n", name);
      }
    };
    int main()
    {
      int t,n,i,m,s;
      char name1[100],name2[100];
      while(~scanf("%d",&t))
      {
        while(t--)
        {
          map<string,KILL>player;
          scanf("%d",&n);
          //getchar();
          bool thefirst=true;
          while(n--)
          {
            scanf("%s kill %s in %d:%d", name1, name2, &m, &s);
              int cur=m*60+s;
            if(!strcmp(name1,name2))//自杀
              {
              	player[name1].died();
              }   
            else
            {
             if(thefirst) //首杀
             {
              printf("%s has First Blood\n",name1);
              thefirst=false;
             }
              player[name2].died();
              player[name1].chenghao(name1,cur); 
            }
          }
        }
      }
      return 0;
    }
    


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值