pat 甲级 1056 Mice and Rice

题目理解有些麻烦
遇到的需要解决的点:
1. 名次问题,本轮名次即为下一组人数加一
2. 分组求本组最大 并且将最大的数 留到下一轮里

注:输出的是 按所拿到的重量在这种分组方式下能排到第几,所以还是 1 2 3 4 5 6 …..号输出对应名次, 而不是按分组的第几号(也就是按第二行输入的序号的对应关系来,不是第三行)

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int p, g;
vector<int> weight;
vector<int> num;
vector<int> order;

int main(){

    scanf("%d%d",&p,&g);
    weight.resize(p);
    num.resize(p);
    order.resize(p);
    for(int i=0; i<p; i++)
        scanf("%d",&weight[i]);
    for(int i=0; i<p; i++)
        scanf("%d",&num[i]);

    int round = 0;
    while(num.size() > 1){

        round = num.size()/g + 1;
        if(num.size()%g != 0) round = round + 1;
        vector<int> next;
        next.clear();
        int n = 0;
        while(n < num.size()){
            int max = -1, index = 0;
            for(int i=0; i<g&&n<num.size(); ++i,++n){
                order[num[n]] = round;
                if(weight[num[n]]>max){
                    max = weight[num[n]];
                    index = num[n];
                }
            }
            next.push_back(index);
        }
        num = next;
    }
    order[num[0]] = 1;
    for(int i=0; i<p; i++){
        if(i == 0) printf("%d",order[i]);
        else printf(" %d",order[i]);
    }

    return 0;
} 

想着先把名次排出来然后在边比较边复制,没实现出来↓

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int p, g;
vector<int> weight;
vector<int> num;
vector<int> order;
vector<int> fin;

int main(){

    scanf("%d%d",&p,&g);
    weight.resize(p);
    num.resize(p);
    order.resize(p);
    fin.resize(p);
    for(int i=0; i<p; i++)
        scanf("%d",&weight[i]);
    for(int i=0; i<p; i++){
        int a;
        scanf("%d",&a);
        num[i] = a;
    }
    int round = g+1;
    int k = 0;
    int v = p;
    while(round >= g){
        if(p%g != 0) {
            round = p/g+1;
            p = round;
            order[k] = round + 1;
            k++;    
        }
        else {
            round = p/g;
            p = round;
            order[k] = round + 1;
            k++;    
        }
        //cout << k << " " << round << endl;
    }
    order[k] = 2;
    k = k+1;
    order[k] = 1;
    int u=0, c=0, index, t=0;
    while(order[t] != 1){
        for(; c<g; u++,c++){

            if(weight[num[u]] > max){
                max = weight[num[u]];
                index = num[u];
            }
            fin[u] = order[t];
        }

        t++;
        c = 0;
    }

    //for(int i=0; i<=k; i++) cout << order[i] << endl;

    return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值