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

题意:

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

代码:

#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[1007],b[1007];
int num;
int ans[1007];
int c[1007],d[1007];
pair<int,int>e[1007];
int flag;
bool vis[1007];
void contest(){
int cnt=0;
int round=0;
int no=0;
for(int i=1;i<=num;++i){
c[++cnt]=b[i];
if(cnt==m||i==num){
++round;
int mx=a[c[1]],pos=c[1];
for(int j=2;j<=cnt;++j){
if(a[c[j]]>mx){
mx=a[c[j]];
pos=c[j];
}
}
for(int j=1;j<=cnt;++j)
if(c[j]==pos)
d[++no]=c[j];
else
vis[c[j]]=1;
cnt=0;
}
}
for(int i=1;i<=num;++i)
if(!ans[b[i]]&&vis[b[i]])
ans[b[i]]=round+1;
if(round==1){
ans[d[1]]=1;
flag=1;
}
for(int i=1;i<=no;++i)
b[i]=d[i];
num=no;
no=0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i];
for(int i=1;i<=n;++i){
cin>>b[i];
++b[i];
}
num=n;
while(!flag)
contest();
cout<<ans[1];
for(int i=2;i<=n;++i)
cout<<" "<<ans[i];
return 0;
}

猜你喜欢

转载自www.cnblogs.com/ldudxy/p/11674701.html