• 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;
    }
    

    大功告成!

  • 相关阅读:
    ZOJ 3278 8G Island 二分+二分
    POJ 2785 4 Values whose Sum is 0 二分
    POJ 3063 Sherlock Holmes 随机化
    UVA 10881 Piortr‘s Ants 思维 模拟
    UVA 1388 Graveyard
    Codeforces Round #410 (Div. 2) B. Mike and strings
    Codeforces 821B
    51nod 1103 N的倍数 抽屉原理
    Codeforces Round #427 (Div. 2) 835D
    Codeforces Round #427 (Div. 2) 835C-Star sky 二维前缀和
  • 原文地址:https://www.cnblogs.com/returnG/p/13089497.html
Copyright © 2020-2023  润新知