PAT 1059 吃老鼠晋级赛

来源:互联网 发布:unity3d开发 编辑:程序博客网 时间:2024/06/02 07:28


题意:

有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:56int 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;}}






原创粉丝点击