Civil War "开启时代杯"湘潭市第二届大学生程序设计大赛 优先队列多条件判断

本文通过模拟一个不断变化的战争博弈过程,记录新势力的出现及各势力间的战斗,最终确定每场战争后哪些势力被消灭。使用优先队列来高效处理每次战斗中最强大的两股势力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


战争即和平,自由即奴役,无知即力量。

——乔治.奥威尔

 

历史书上说,自从统治者Big Brother去世以后,大洋国就陷入了无休止的内战中,随时都可能有新的武装势力出现,随时都可能有战争发生。奇怪的是,每次战争都是在当前国内战斗力最强大的两股势力间进行,我们可以把每股武装势力的战斗力量化成一个值,每次战争都是在当前战斗力值最高的两股势力间进行。如果有多支势力战斗力值相同,则名字字典序大的在前(见下面第二组样例)。一场战争结束后,战斗力稍弱的那方被消灭,另一方也元气大伤,战斗力减弱为两支武装的战斗力之差。如果发生战争的两方战斗力相同,则他们会同归于尽。

 

历史书上详细记录了该段时期的事件,记录分为两种格式:

 

1) New name value 其中namevalue是变量,表示一个名字叫做name,战斗力为value的新势力出现

2) Fight 表示在当前最强的两股势力间发生了战争

 

现在请你根据书上记录,计算出每场战争以后分别导致哪支(或哪两支)势力被消灭。

 

输入

 

输入的第一行包含一个整数T (T ≤ 15),表示共有T组数据。接下来每组数据的第一行是一个整数N (N 50000),表示有N条记录。接下来N行,每行表示一条记录,记录的格式如上所述。输入保证每股势力的名字都不相同,势力的名字仅包含小写字母,长度不超过20。战斗力值为不超过10000的正整数。保证当战争发生时至少有两支势力存在。

 

输出

 

对每组数据,输出一行“Case X:”作为开头,此处X为从1开始的编号。注意首字母C为大写,在“Case”和编号X之间有一个空格,在编号X后面有一个冒号。然后对每条Fight记录输出一行,表示被消灭的势力的名字。如果是两支势力同归于尽,则这两个名字都应该输出,字典序大的在前,两个名字之间用一个空格隔开。

 

样例输入

 

2

 

5

 

New obrien 100

 

New winston 199

 

Fight

 

New julia 99

 

Fight

 

4

 

New miniluv 100

 

New minipax 100

 

New minitrue 100

 

Fight

 

 

样例输出

 

Case 1:

 

obrien

 

winston julia

 

Case 2:

 

minitrue minipax

 

         


#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct haha
{
 char s[50];
 int val;
 bool operator <(const haha &a) const  //第一次去尝试 二个判断  以前也没有见过
    {
   if(val!=a.val) return val<a.val;
   else
   {
    if(strcmp(s,a.s)<0)
    return true;  //用ture  貌似用 1   会有提示影响程序
    if(strcmp(s,a.s)>0)
     return false;
   }
    
    } 
}q,temp1,temp2;
int main()
{
 int i,j,cas;
 scanf("%d",&cas);
 for(i=1;i<=cas;i++)
 {
  int n,val;
 printf("Case %d:\n",i);
        priority_queue<haha>duilie;//
  char s[30];
  scanf("%d",&n);// 
  while(n--)
  {
             scanf("%s",s);
    if(s[0]=='N')
    {
     scanf("%s %d",q.s,&q.val);
     duilie.push(q);
    }
    else
    {
     temp1=duilie.top();
     duilie.pop();
     temp2=duilie.top();
     duilie.pop();
     if(temp1.val>temp2.val)
     {
      printf("%s\n",temp2.s);
      temp1.val-=temp2.val;
      duilie.push(temp1);
     }
     else
      if(temp1.val<temp2.val)
      {
         printf("%s\n",temp1.s);
         temp2.val-=temp1.val;
      duilie.push(temp2);
      }
      else
      {
       printf("%s %s\n",temp1.s,temp2.s);
      }
    
    }
  }
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值