您的位置:首页 > 其它

UVa 978 - Lemmings Battle!

2017-02-23 22:12 716 查看
題目:有兩隊戰士,每個戰士有一個戰鬥力,每次從每個隊伍里選擇最強的B的戰鬥,

            戰鬥力高的勝利(戰鬥力變為他們的差)、低的死亡(相同時同歸於盡),

           倖存的戰士厚道隊伍,準備下次戰鬥(如果少於B個就全去),直到一方沒人,

           求最後剩下隊伍的每個戰士的戰鬥力(或者兩方都全部死亡)。

分析:模擬、stl。這裡使用multiset模擬隊列(可以保證有序)。

            每次在green和blue的multiset中取出B個元素(不足就一起取最少的個數);

            計算兩者的差值(green - blue),通過政府判斷倖存者(0 為一起死亡),

            將存回對應的multiset,進行下次模擬,直到有一方的multiset為空(或全空)。

說明:文章找回來了╮(╯▽╰)╭,非常感謝CSDN的工作人員O(∩_∩)O~。

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <set>

using namespace std;

int battlefields[100000];
int sg_data[100000];
int sb_data[100000];

int main()
{
int N, B, SG, SB;
while (~scanf("%d",&N))
while (N --) {
scanf("%d%d%d",&B,&SG,&SB);
for (int i = 0; i < SG; ++ i) {
scanf("%d",&sg_data[i]);
}
for (int i = 0; i < SB; ++ i) {
scanf("%d",&sb_data[i]);
}

multiset<int> sg;
multiset<int> sb;
for (int i = 0; i < SG; ++ i) {
sg.insert(sg_data[i]);
}
for (int i = 0; i < SB; ++ i) {
sb.insert(sb_data[i]);
}

while (!sg.empty() && !sb.empty()) {
int size = 0;
for (int i = 0; i < B; ++ i) {
if (sg.empty() || sb.empty()) {
break;
}
battlefields[size ++] = *sg.rbegin() - *sb.rbegin();
sg.erase(sg.lower_bound(*sg.rbegin()));
sb.erase(sb.lower_bound(*sb.rbegin()));
}
for (int i = 0; i < size; ++ i) {
if (battlefields[i] > 0) {
sg.insert(battlefields[i]);
}else if (battlefields[i] < 0) {
sb.insert(-battlefields[i]);
}
}
}

if (sg.empty() && sb.empty()) {
puts("green and blue died");
}else if (sg.empty()) {
printf("blue wins\n");
while (!sb.empty()) {
printf("%d\n",*sb.rbegin());
sb.erase(sb.lower_bound(*sb.rbegin()));
}
}else {
printf("green wins\n");
while (!sg.empty()) {
printf("%d\n",*sg.rbegin());
sg.erase(sg.lower_bound(*sg.rbegin()));
}
}

if (N) {
puts("");
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: