zoukankan      html  css  js  c++  java
  • 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;
    }
    

    大功告成!

  • 相关阅读:
    SDUT3926 kmp
    SDUT 3930 线段树
    HDU 3277 最大流+二分
    HDU 3081 最大流+二分
    HDU 3605 最大流+状态压缩
    HDU 3572 最大流
    HDU 4576 DP
    POJ 2289 最大流
    POJ 1698 最大流
    poj 3498 最大流
  • 原文地址:https://www.cnblogs.com/returnG/p/13089497.html
Copyright © 2011-2022 走看看