PAT 1059 吃老鼠晋级赛


题意:

有n个程序,要比赛吃老鼠,但是要分组比。每次小组胜利的晋级下一次比赛,直到分出第一名为止。

主要是理解输入

第一行是比赛程序的数量,和 每个小组的成员数。

第二行是每个程序能够吃的老鼠数量。

第三行是将这些程序排了个队,从左到右依次站好,按照顺序一个个分组,比赛。

例如例子里的第三行为6 0 8 7 10 5 8 1 4 2 3

则分为了

(6 0 8) (7 10 5) (8 1 4) (2 3) 这四组。

比赛后剩下 8 5 9 3

则分为 (8 5 9) 和(3)这两组。

以此类推,直到8号程序获得冠军。

最后输出从0号到m号的排名。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
#define INF 99999999
#define M 2000

//start  21:22
//end    21:56
int main(){
	int n,m;
	int w[M];
	int i;
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++)
		scanf("%d",&w[i]);
	
	vector<int> q;
	int qorder;
	for(i=0;i<n;i++)
	{
		scanf("%d",&qorder);
		q.push_back(qorder);
	}

	
	vector<int> wq;//储存胜者的数组
	int qn;
	int rank[M];
	int maxi,maxw,rankn,j;
	while(q.size() > 1 ) //比赛者只剩下1个时,比赛结束
	{
		//确定这次比赛败者的名次
		//即败者名次 = 胜出者数量 + 1
	    	qn = q.size();
		if(qn%m!=0) //若不整除,为胜者数量为qn/m+1 ,排名再要+1
			rankn = qn/m + 1 + 1;
		else rankn = qn/m + 1;

		maxw = -1;
		for(j = 0; j < q.size(); j++)
		{
			i = q[j]; //这才是比赛者的序号
			rank[i] = rankn;//都先预设为败者
			if(w[i] > maxw )
			{
				maxw = w[i];
				maxi = i;
			}

			if((j+1) % m == 0 || j==q.size()-1)
			{
				wq.push_back(maxi); //胜者晋级
				//继续进行下一组
				maxw = -1;
			}
		}
		q = wq;
		wq.clear(); 
	}
	rank[maxi] = 1;
	for(i=0;i<n;i++)
	{
		printf("%d",rank[i]);
		if(i!=n-1)
			cout<<" ";
		else cout<<endl;
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值