1056. Mice and Rice (25)-PAT甲级真题

当时没想到可以用队列来做,就傻傻的模拟了,用cur存当前轮的id,这个id对应的是order的下标,这里有个求rank的技巧就是当前轮没有晋级的rank为(当前轮的组数+1)

模拟:

#include<bits/stdc++.h>
using namespace std;
struct node{
    int id,w,rk=0;
};
vector<node> vec;
vector<int> order,cur; //cur用来记录当前晋级的组里面的id,对应order数组的下标
int np,ng;
bool cmp(node&a, node& b){
    return a.rk>b.rk;
}
int main(){
    scanf("%d%d",&np,&ng);
    vec.resize(np);
    order.resize(np);
    cur.resize(np);
    for(int i=0;i<np;i++){
        scanf("%d",&vec[i].w);
        vec[i].id=i;
        cur[i]=i;
    }
    for(int i=0;i<np;i++)
        scanf("%d",&order[i]);
    if(cur.size()==1){
        printf("1");
        return 0;
    }
    while(cur.size()>1){
        int start=0;
        vector<int> temp;
        int numg; //当前分组数
        if(cur.size()%ng!=0) numg=cur.size()/ng+1;
        else numg=cur.size()/ng;
        while(start<cur.size()){
            int max=-1,maxi=0;
            for(int i=start;i<start+ng&&i<cur.size();i++){
                vec[order[cur[i]]].rk=numg+1;
                if(max<vec[order[cur[i]]].w){
                    max=vec[order[cur[i]]].w;
                    maxi=i;
                }
            }
            vec[order[cur[maxi]]].rk=numg==1?1:numg+1;
            temp.push_back(cur[maxi]);
            start+=ng;
        }
        cur=temp;
    }
    sort(vec.begin(),vec.end(),[](node& a,node& b){return a.id<b.id;});
    for(int i=0;i<vec.size();i++)
        printf(i==0?"%d":" %d",vec[i].rk);
    return 0;
}

柳神的队列做法:

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
struct node {
    int weight, index, rank, index0;
};
bool cmp1(node a, node b) {
    return a.index0 < b.index0;
}
int main() {
    int n, g, num;
    scanf("%d%d", &n, &g);
    vector<int> v(n);
    vector<node> w(n);
    for(int i = 0; i < n; i++)
        scanf("%d", &v[i]);
    for(int i = 0; i < n; i++) {
        scanf("%d", &num);
        w[i].weight = v[num];
        w[i].index = i;
        w[i].index0 = num;
    }
    queue<node> q;
    for(int i = 0; i < n; i++)
        q.push(w[i]);
    while(!q.empty()) {
        int size = q.size();
        if(size == 1) {
            node temp = q.front();
            w[temp.index].rank = 1;
            break;
        }
        int group = size / g;
        if(size % g != 0)
            group += 1;
        node maxnode;
        int maxn = -1, cnt = 0;
        for(int i = 0; i < size; i++) {
            node temp = q.front();
            w[temp.index].rank = group + 1;
            q.pop();
            cnt++;
            if(temp.weight > maxn) {
                maxn = temp.weight;
                maxnode = temp;
            }
            if(cnt == g || i == size - 1) {
                cnt = 0;
                maxn = -1;
                q.push(maxnode);
            }
        }
    }
    sort(w.begin(), w.end(), cmp1);
    for(int i = 0; i < n; i++) {
        if(i != 0) printf(" ");
        printf("%d", w[i].rank);
    }
    return 0;
}

### 回答1: `kernel.mice(2)` 翻译成中文的意思是 `核心.多重离散数据插补(2)`,是缺失值插补方法之一,用于处理多重离散数据中的缺失值。它是通过模拟马尔科夫链来生成缺失值的多个可能值,然后通过多个回归模型进行插补。其中的参数 2 表示生成的多个可能值的数量。这个方法通常用于处理分类变量中的缺失值。 ### 回答2: 在Python中,kernel.mice(2) 是一种基于多元插补的方法,用于处理数据中的缺失值。该方法使用鼠标算法(Multiple Imputation by Chained Equations, MICE)来估计缺失值,并生成多个完整的数据集。 具体而言,kernel.mice(2)是通过迭代的方式,将数据集中的缺失值替换为估计值。首先,算法通过观察到的数据计算缺失值的条件分布。然后,它使用这些条件分布来模拟缺失值的多个可能值,以创建多个完整的数据集。随后,对于每个数据集,算法会执行建模和分析,得到对应的估计值。最后,每个数据集的估计值被合并成一个单一的结果。 使用kernel.mice(2)可以更好地处理缺失值,因为它考虑了特征之间的相互依赖关系。当数据集中存在多个缺失值或缺失值的分布有一定复杂性时,该方法可以提供更准确的估计。 总之,kernel.mice(2)是一种用于处理缺失值的方法,它通过多元插补和迭代的方式,生成多个完整的数据集,并利用这些数据集进行估计和分析。 ### 回答3: kernel.mice(2)是Python中一个函数的调用,意思是调用名为"kernel.mice"的函数并传入参数值为2。函数名中的"kernel"可能指的是某个核心功能或者框架,而"mice"可能是函数的具体功能或者用途的名称。传入的参数2可能是函数需要使用的某个变量或者数值。具体的功能和参数的含义需要查看函数的定义或者文档来确定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值