ZJU-PAT 1056. Mice and Rice (25) 浙大2013年上机复试第四题

#pragma warning (disable:4786)
#include<iostream>
#include<string>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;

int n,m;
int B[100005];

int flag;

int cnt;//第几轮次被淘汰 

int group[1005],num_in_group;

struct mice
{
	int id;
	int weight;
	bool join;
	int rounds;
	int rank;
};
mice TT[100005];

bool judge()
{
	for(int i=0;i<n;i++) 
	{
		if(TT[i].join==false) return true;
	}
	return false;
}

bool cmp(mice a,mice b)
{
	return a.rounds >b.rounds;
}


bool cmp1(mice a,mice b)
{
	return a.id<b.id;
}

void process(int num)
{
	if(flag==n-1)
	{
		TT[group[0]].rounds=cnt;
		TT[group[0]].join=true;
		return;
	}

	int _id=-1,_max=-1,i;

	for(i=0;i<num;i++)
	{
		if(TT[group[i]].weight>_max) 
		{
			_max=TT[group[i]].weight;
			_id=i;
		}
	}
	for(i=0;i<num;i++)
	{
		if(i==_id) continue;
		TT[group[i]].rounds=cnt;
		TT[group[i]].join=true;
		flag++;
	}
}


int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		int i,j;
		
		//-------input--------
		for(i=0;i<n;i++) 
		{
			scanf("%d",&TT[i].weight);
			TT[i].join=false;
			TT[i].id=i;
		}
		for(i=0;i<n;i++) scanf("%d",&B[i]);
		
		
		//------group----------
		cnt=1;
		flag=0;
		while(judge())
		{
			num_in_group=0;
			
			for(i=0;i<n;i++) 
			{
				if(TT[B[i]].join==true) continue;
				group[num_in_group++]=B[i];
				
				if(num_in_group==m) 
				{
					process(num_in_group);
					num_in_group=0;
				}
			}
			if(num_in_group) process(num_in_group);
			cnt++;
		}

		//-------output----------
		sort(TT,TT+n,cmp);
		TT[0].rank=1;

		for(i=1;i<n;i++)
		{
			if(TT[i].rounds==TT[i-1].rounds)
				TT[i].rank=TT[i-1].rank;
			else TT[i].rank=i+1;
		}
		sort(TT,TT+n,cmp1);

		for(i=0;i<n;i++)
		{
			if(i!=n-1)
				printf("%d ",TT[i].rank);
			else
				printf("%d\n",TT[i].rank);
		}
	}
	return 0;
}

你可能感兴趣的:(ACM,pat,ZJU)