PAT Mice and Rice
题目链接
题意:
给定初始长度为np的序列级其排列顺序,以ng为周期,每次在周期内进行比较,只保留周期内最大的元素,重复操作直到只剩最后一个元素(即最大的元素),然后对其进行排名,同一批被刷掉的元素排名相同,计算排名时,前面如果有相同的元素也要算作两个来计。
思路:
将读入的奶牛排好序,然后用队列模拟一遍去除奶牛的情况。模拟去除奶牛不难,但如何计算出排名是个问题。根据题意,不难发现,比如某次去除后,还剩下4个,那么被去除的元素排名为第5;同理,某次去除后还剩x个,那么被去除的元素的排名为第(x+1)个;设去除前的元素个数为x个,那么去除后的元素个数为ceil(x/ng);那么其排名为:ceil(x/ng)+1;所以每次模拟时以此更新一下就行了
100分AC代码:
#include <bits/stdc++.h>
using namespace std;
int np,ng;
int w[10000005];
int ans[10000005];
int main() {
cin>>np>>ng;
vector <int> q;
vector <int> q2;
for(int i=0;i<np;i++)cin>>w[i];
for(int i=0;i<np;i++){
int x;
cin>>x;
q.push_back(x);
}
while(1){
for(int i=0;i<q.size();i++)ans[q[i]]=ceil((double)q.size()/ng)+1;
if(q.size()==1){
ans[q[0]]=1;
break;
}
int j,ip,maxx=0;
for(j=0;j<q.size();j++){
if(maxx<w[q[j]]){
maxx=w[q[j]];
ip=q[j];
}
if((j+1)%ng==0){
maxx=0;
q2.push_back(ip);
}
}
if(q.size()%ng!=0){
q2.push_back(ip);
}
q.clear();
for(int j=0;j<q2.size();j++)q.push_back(q2[j]);
q2.clear();
}
for(int i=0;i<np;i++)cout<<ans[i]<<' ';
return 0;
}
大功告成!
不点个推荐再走么?( • ̀ω•́ )✧