【PAT甲级】1056 Mice and Rice (25 分)

题意:

输入两个正整数N和M(<=1000),接着输入两行,每行N个数,第一行为每只老鼠的重量,第二行为每只老鼠出战的顺序。输出它们的名次。(按照出战顺序每M只老鼠分为一组,剩余不足M只为一组,每组只能有一个胜者,其他老鼠排名均为这一轮胜者数量+1)

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 int n,m;
 5 int a[1007],b[1007];
 6 int num;
 7 int ans[1007];
 8 int c[1007],d[1007];
 9 pair<int,int>e[1007];
10 int flag;
11 bool vis[1007];
12 void contest(){
13     int cnt=0;
14     int round=0;
15     int no=0;
16     for(int i=1;i<=num;++i){
17         c[++cnt]=b[i];
18         if(cnt==m||i==num){
19             ++round;
20             int mx=a[c[1]],pos=c[1];
21             for(int j=2;j<=cnt;++j)
22                 if(a[c[j]]>mx){
23                     mx=a[c[j]];
24                     pos=c[j];
25                 }
26             for(int j=1;j<=cnt;++j)
27                 if(c[j]==pos)
28                     d[++no]=c[j];
29                 else
30                     vis[c[j]]=1;
31             cnt=0;
32         }
33     }
34     for(int i=1;i<=num;++i)
35         if(!ans[b[i]]&&vis[b[i]])
36             ans[b[i]]=round+1;
37     if(round==1){
38         ans[d[1]]=1;
39         flag=1;
40     }
41     for(int i=1;i<=no;++i)
42         b[i]=d[i];
43     num=no;
44     no=0;
45 }
46 int main(){
47     ios::sync_with_stdio(false);
48     cin.tie(NULL);
49     cout.tie(NULL);
50     cin>>n>>m;
51     for(int i=1;i<=n;++i)
52         cin>>a[i];
53     for(int i=1;i<=n;++i){
54         cin>>b[i];
55         ++b[i];
56     }
57     num=n;
58     while(!flag)
59         contest();
60     cout<<ans[1];
61     for(int i=2;i<=n;++i)
62         cout<<" "<<ans[i];
63     return 0;
64 }
保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/11674701.html