描述
魔兽世界的西面是红魔军的司令部,东面是蓝魔军的司令部。两个司令部之间是依次排列的若干城市。
红司令部,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 }
有1的基础只需要很短的时间就能改好
但这是建立在我忽略了“在以后的题目里,武士的士气,生命值,忠诚度在其生存期间都可能发生变化,都有作用,武士手中的武器随着使用攻击力也会发生变化”这句话的基础之上的
不然也有意要为三打好基础去实现的(所以改动了class 但后来一个也没用上orz 就这么直接交上去了)
但果然懒得弄……