18.03.23 魔兽世界之二:装备

描述

魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。 

红司令部,City 1,City 2,……,City n,蓝司令部

两军的司令部都会制造武士。武士一共有 dragon 、ninja、iceman、lion、wolf 五种。每种武士都有编号、生命值这两种属性。 
有的武士可以拥有武器。武器有三种,sword, bomb,和arrow,编号分别为0,1,2。
双方的武士编号都是从1开始计算。红方制造出来的第 n 个武士,编号就是n。同样,蓝方制造出来的第 n 个武士,编号也是n。 

不同的武士有不同的特点。
dragon 可以拥有一件武器。编号为n的dragon降生时即获得编号为 n%3 的武器。dragon还有“士气”这个属性,是个浮点数,其值为它降生后其司令部剩余生命元的数量除以造dragon所需的生命元数量。
ninja可以拥有两件武器。编号为n的ninja降生时即获得编号为 n%3 和 (n+1)%3的武器。
iceman有一件武器。编号为n的iceman降生时即获得编号为 n%3 的武器。
lion 有“忠诚度”这个属性,其值等于它降生后其司令部剩余生命元的数目。
wolf没特点。
请注意,在以后的题目里,武士的士气,生命值,忠诚度在其生存期间都可能发生变化,都有作用,武士手中的武器随着使用攻击力也会发生变化。

武士在刚降生的时候有一个生命值。 

在每个整点,双方的司令部中各有一个武士降生。 

红方司令部按照 iceman、lion、wolf、ninja、dragon 的顺序循环制造武士。 

蓝方司令部按照 lion、dragon、ninja、iceman、wolf 的顺序循环制造武士。 

制造武士需要生命元。 

制造一个初始生命值为 m 的武士,司令部中的生命元就要减少 m 个。 

如果司令部中的生命元不足以制造某个按顺序应该制造的武士,那么司令部就试图制造下一个。如果所有武士都不能制造了,则司令部停止制造武士。
给定一个时间,和双方司令部的初始生命元数目,要求你将从0点0分开始到双方司令部停止制造武士为止的所有事件按顺序输出。
一共有两种事件,其对应的输出样例如下: 

1) 武士降生 
输出样例: 004 blue lion 5 born with strength 5,2 lion in red headquarter
表示在 4点整,编号为5的蓝魔lion武士降生,它降生时生命值为5,降生后蓝魔司令部里共有2个lion武士。(为简单起见,不考虑单词的复数形式)注意,每制造出一个新的武士,都要输出此时司令部里共有多少个该种武士。
如果造出的是dragon,那么还要输出一行,例:
It has a arrow,and it's morale is 23.34
表示该dragon降生时得到了arrow,其士气是23.34(为简单起见,本题中arrow前面的冠词用a,不用an,士气精确到小数点后面2位,四舍五入)
如果造出的是ninja,那么还要输出一行,例:
It has a bomb and a arrow
表示该ninja降生时得到了bomb和arrow。
如果造出的是iceman,那么还要输出一行,例:
It has a sword
表示该iceman降生时得到了sword。
如果造出的是lion,那么还要输出一行,例:
It's loyalty is 24
表示该lion降生时的忠诚度是24。
2) 司令部停止制造武士
输出样例: 010 red headquarter stops making warriors
表示在 10点整,红方司令部停止制造武士

输出事件时: 

首先按时间顺序输出; 

同一时间发生的事件,先输出红司令部的,再输出蓝司令部的。

输入第一行是一个整数,代表测试数据组数。

每组测试数据共两行。 

第一行,一个整数M。其含义为: 每个司令部一开始都有M个生命元( 1 <= M <= 10000) 

第二行:五个整数,依次是 dragon 、ninja、iceman、lion、wolf 的初始生命值。它们都大于0小于等于10000输出对每组测试数据,要求输出从0时0分开始,到双方司令部都停止制造武士为止的所有事件。
对每组测试数据,首先输出“Case:n" n是测试数据的编号,从1开始 
接下来按恰当的顺序和格式输出所有事件。每个事件都以事件发生的时间开头,时间以小时为单位,有三位。

样例输入

1
20
3 4 5 6 7

样例输出

Case:1
000 red iceman 1 born with strength 5,1 iceman in red headquarter
It has a bomb
000 blue lion 1 born with strength 6,1 lion in blue headquarter
It's loyalty is 14
001 red lion 2 born with strength 6,1 lion in red headquarter
It's loyalty is 9
001 blue dragon 2 born with strength 3,1 dragon in blue headquarter
It has a arrow,and it's morale is 3.67
002 red wolf 3 born with strength 7,1 wolf in red headquarter
002 blue ninja 3 born with strength 4,1 ninja in blue headquarter
It has a sword and a bomb
003 red headquarter stops making warriors
003 blue iceman 4 born with strength 5,1 iceman in blue headquarter
It has a bomb
004 blue headquarter stops making warriors
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <stdlib.h>
  5 
  6 using namespace std;
  7 
  8 class warrior{
  9 public:
 10     int str;
 11     int totalnum_r;
 12     int totalnum_b;
 13     int id;
 14 };
 15 
 16 class dragon:public warrior
 17 {
 18 public:
 19     int weapon;//武器编号为id%3
 20     double morale;//士气为司令部剩余生命元数量/dragon生命值
 21 };
 22 class iceman:public warrior
 23 {
 24 public:
 25     int weapon1;//id%3
 26     int weapon2;//(id+1)%3
 27 };
 28 class ninja:public warrior
 29 {
 30 public:
 31     int weapon;//id%3
 32 };
 33 class wolf:public warrior{};
 34 class lion:public warrior
 35 {
 36 public:
 37     int loyalty;//司令部剩余生命元数量
 38 };
 39 class red
 40 {
 41 public:
 42     int warrior;
 43 };
 44 class blue
 45 {
 46 public:
 47     int warrior;
 48 };
 49 
 50 char weaptype[3][10]={"sword","bomb","arrow"};
 51 
 52 //red:i,l,w,n,d
 53 //blue:l,d,n,i,w
 54 //生命元根据生成武士的生命值减少
 55 //先红后蓝
 56 //weapon:sword bomb arrow--012
 57 int main()
 58 {
 59     int n;//case数
 60     cin >> n;
 61     for (int c = 1; c <= n; c++) {
 62         int M;//每个司令部的初始生命元数量
 63         int r_n, b_n, r_w = 1, b_w = 1;//红蓝双方的生命元数,红蓝双方要制造的武士类型
 64         dragon d;
 65         ninja n;
 66         iceman i;
 67         lion l;
 68         wolf w;
 69         red r;
 70         blue b;
 71         d.totalnum_r = 0, d.totalnum_b = 0;
 72         i.totalnum_r = 0, i.totalnum_b = 0;
 73         n.totalnum_r = 0, n.totalnum_b = 0;
 74         l.totalnum_r = 0, l.totalnum_b = 0;
 75         w.totalnum_r = 0, w.totalnum_b = 0;
 76         r.warrior = 0, b.warrior = 0;
 77         cin >> M >> d.str >> n.str >> i.str >> l.str >> w.str;
 78         int strmin = min(d.str, i.str);
 79         strmin = min(strmin, n.str);
 80         strmin = min(strmin, l.str);
 81         strmin = min(strmin, w.str);
 82         r_n = M, b_n = M;
 83         int t = 0;
 84         int flag_r = 1, flag_b = 1;//判断是否已停产的条件
 85         printf("Case:%d
", c);
 86         while (r_n >= strmin|| b_n >= strmin) {
 87             if (r_n < strmin&&flag_r)
 88             {
 89                 flag_r = 0;
 90                 printf("%03d red headquarter stops making warriors
", t);
 91             }
 92             int rcons = 0, bcons = 0;//红蓝双方这次要消耗的生命元数
 93             while (r_n >= strmin)
 94             {
 95                 switch (r_w)
 96                 {
 97                 case 1:rcons = i.str; break;
 98                 case 2:rcons = l.str; break;
 99                 case 3:rcons = w.str; break;
100                 case 4:rcons = n.str; break;
101                 case 5:rcons = d.str; break;
102                 }
103                 if (r_n < rcons) {
104                     r_w++;
105                     if (r_w > 5)
106                         r_w -= 5;
107                     continue;
108                 }
109                     r_n -= rcons;
110                     printf("%03d red ", t);
111                     switch (r_w)
112                     {
113                     case 1: {i.totalnum_r++; r.warrior++; printf("iceman %d born with strength %d,%d iceman", r.warrior, i.str, i.totalnum_r); break; }
114                     case 2: {l.totalnum_r++; r.warrior++; printf("lion %d born with strength %d,%d lion", r.warrior, l.str, l.totalnum_r); break; }
115                     case 3: {w.totalnum_r++; r.warrior ++; printf("wolf %d born with strength %d,%d wolf", r.warrior, w.str, w.totalnum_r); break; }
116                     case 4: {n.totalnum_r++; r.warrior++; printf("ninja %d born with strength %d,%d ninja", r.warrior, n.str, n.totalnum_r); break; }
117                     case 5: {d.totalnum_r++; r.warrior++; printf("dragon %d born with strength %d,%d dragon", r.warrior, d.str, d.totalnum_r); break; }
118                     }
119                     printf(" in red headquarter
");
120                     switch (r_w)
121                     {
122                     case 1: { printf("It has a %s
", weaptype[r.warrior%3]); break; }
123                     case 2: { printf("It's loyalty is %d
", r_n); break; }
124                     case 3: break;
125                     case 4: { printf("It has a %s and a %s
", weaptype[r.warrior%3],weaptype[(r.warrior+1)%3]); break; }
126                     case 5: { printf("It has a %s,and it's morale is %.2lf
", weaptype[r.warrior%3],r_n*1.0/d.str); break; }
127                     }
128                     break;
129             }
130             if (b_n < strmin&&flag_b)
131             {
132                 flag_b = 0;
133                 printf("%03d blue headquarter stops making warriors
", t);
134             }
135             while (b_n >= strmin)
136             {
137                 switch (b_w)
138                 {
139                 case 1:bcons = l.str; break;
140                 case 2:bcons = d.str; break;
141                 case 3:bcons = n.str; break;
142                 case 4:bcons = i.str; break;
143                 case 5:bcons = w.str; break;
144                 }
145                 if (b_n < bcons) {
146                     b_w++;
147                     if (b_w > 5)
148                         b_w -= 5;
149                     continue;
150                 }
151                     b_n -= bcons;
152                     printf("%03d blue ", t);
153                     switch (b_w)
154                     {
155                     case 1: {l.totalnum_b++; b.warrior++;  printf("lion %d born with strength %d,%d lion", b.warrior, l.str, l.totalnum_b); break; }
156                     case 2: {d.totalnum_b++; b.warrior++; printf("dragon %d born with strength %d,%d dragon", b.warrior, d.str, d.totalnum_b); break; }
157                     case 3: {n.totalnum_b++; b.warrior++; printf("ninja %d born with strength %d,%d ninja", b.warrior, n.str, n.totalnum_b); break; }
158                     case 4: {i.totalnum_b++; b.warrior++; printf("iceman %d born with strength %d,%d iceman", b.warrior, i.str, i.totalnum_b); break; }
159                     case 5: {w.totalnum_b++; b.warrior++; printf("wolf %d born with strength %d,%d wolf", b.warrior, w.str, w.totalnum_b); break; }
160                     }
161                     printf(" in blue headquarter
");
162                     switch (b_w)
163                     {
164                     case 4: { printf("It has a %s
", weaptype[b.warrior%3]); break; }
165                     case 1: { printf("It's loyalty is %d
", b_n); break; }
166                     case 5: break;
167                     case 3: { printf("It has a %s and a %s
", weaptype[b.warrior%3],weaptype[(b.warrior+1)%3]); break; }
168                     case 2: { printf("It has a %s,and it's morale is %.2lf
", weaptype[b.warrior%3],b_n*1.0/d.str); break; }
169                     }
170                     break;
171             }
172             t++;
173             r_w++,b_w++;
174             if (r_w > 5)
175                 r_w -= 5;
176             if (b_w>5)
177                 b_w -= 5;
178         }
179         if (flag_r)
180             printf("%03d red headquarter stops making warriors
", t);
181         if (flag_b)
182             printf("%03d blue headquarter stops making warriors
", t);
183     }
184         return 0;
185     }
View Code

有1的基础只需要很短的时间就能改好

但这是建立在我忽略了“在以后的题目里,武士的士气,生命值,忠诚度在其生存期间都可能发生变化,都有作用,武士手中的武器随着使用攻击力也会发生变化”这句话的基础之上的

不然也有意要为三打好基础去实现的(所以改动了class 但后来一个也没用上orz 就这么直接交上去了)

但果然懒得弄……

注定失败的战争,也要拼尽全力去打赢它; 就算输,也要输得足够漂亮。
原文地址:https://www.cnblogs.com/yalphait/p/8631049.html