本文主要是介绍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 ,排名再要+1rankn = 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;}
}
这篇关于PAT 1059 吃老鼠晋级赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!