UVa 978 - Lemmings Battle!

題目:有兩隊戰士,每個戰士有一個戰鬥力,每次從每個隊伍里選擇最強的B的戰鬥,

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

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

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

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

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

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

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

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

#include 
#include 
#include 
#include 
#include 

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 sg;
		multiset 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;
}


你可能感兴趣的:(解题报告)