boj 317

只需寻找到连续的两个序列时,一个pawn上去消灭一个rook。但是选取哪个pawn上去的时候要根据以下原则,其实就是为了连续序列时能消灭更多的rook

if(curPawnsCol[j]<curPawnsCol[j+1])
						curPawnsCol[j+1]--;
					else
						curPawnsCol[j]--;

 代码:

#include<iostream>
using namespace std;

#define N 1002
#define M 1002

int curPawnsCol[M];

int main()
{
	int t,n,m;
	scanf("%d",&t);
	while(t--)
	{
		int k,p;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
			curPawnsCol[i]=0;// no pawns: init
		scanf("%d",&k);
		scanf("%d",&p);
		for(int i=0;i<p;i++)
		{
			int px,py;
			scanf("%d%d",&px,&py);
			curPawnsCol[py]++;//the num of pawns at the py th column
		}
		bool flag;
		for(int i=1;i<=k;i++)
		{
			flag=false;
			for(int j=1;j<m;j++)
			{
				if(curPawnsCol[j]>0&&curPawnsCol[j+1]>0)
				{
					flag=true;
					if(curPawnsCol[j]<curPawnsCol[j+1])
						curPawnsCol[j+1]--;
					else
						curPawnsCol[j]--;
					break;
				}
			}
			if(flag==false)
				break;
		}
		if(flag==false)
			printf("POOL PAWN\n");
		else
			printf("UNSTOPPABLE\n");
	}
	return 0;
}

 

 

你可能感兴趣的:(BO)