自学内容网 自学内容网

1056 Mice and Rice (25)

Mice and Rice is the name of a programming contest in which each programmer must write a piece of code to control the movements of a mouse in a given map. The goal of each mouse is to eat as much rice as possible in order to become a FatMouse.

First the playing order is randomly decided for NP​ programmers. Then every NG​ programmers are grouped in a match. The fattest mouse in a group wins and enters the next turn. All the losers in this turn are ranked the same. Every NG​ winners are then grouped in the next match until a final winner is determined.

For the sake of simplicity, assume that the weight of each mouse is fixed once the programmer submits his/her code. Given the weights of all the mice and the initial playing order, you are supposed to output the ranks for the programmers.

Input Specification:

Each input file contains one test case. For each case, the first line contains 2 positive integers: NP​ and NG​ (≤1000), the number of programmers and the maximum number of mice in a group, respectively. If there are less than NG​ mice at the end of the player's list, then all the mice left will be put into the last group. The second line contains NP​ distinct non-negative numbers Wi​ (i=0,⋯,NP​−1) where each Wi​ is the weight of the i-th mouse respectively. The third line gives the initial playing order which is a permutation of 0,⋯,NP​−1 (assume that the programmers are numbered from 0 to NP​−1). All the numbers in a line are separated by a space.

Output Specification:

For each test case, print the final ranks in a line. The i-th number is the rank of the i-th programmer, and all the numbers must be separated by a space, with no extra space at the end of the line.

Sample Input:

11 3
25 18 0 46 37 3 19 22 57 56 10
6 0 8 7 10 5 9 1 4 2 3

Sample Output:

5 5 5 2 5 5 5 3 1 3 5

题目大意:np为老鼠的数量,ng为每组最多g个老鼠。先给出np个老鼠的重量,再给出老鼠的初始顺序(第i名的老鼠是第j号,j从0开始)。每ng个老鼠分为一组(最后不足np的单独为1组),对于每组老鼠,选出最重的那个,晋级下一轮比赛,未晋级的排名为队伍数量+1,再依次再以np个老鼠一组分类,然后选出重量最大的,直到只剩下一只老鼠,排名为1。这个排名是按照原输入老鼠的顺序输出老鼠的排名。

分析:模拟比赛即可。注意第一次比赛是按照给定的顺序进行,之后的比赛是按照每次晋级老鼠的位置进行。

#include<algorithm>
#include <iostream>
#include  <cstdlib>
#include  <cstring>
#include   <string>
#include   <vector>
#include   <cstdio>
#include    <queue>
#include    <stack>
#include    <ctime>
#include    <cmath>
#include      <map>
#include      <set>
#define INF 0xffffffff
#define db1(x) cout<<#x<<"="<<(x)<<endl
#define db2(x,y) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<endl
#define db3(x,y,z) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<endl
#define db4(x,y,z,r) cout<<#x<<"="<<(x)<<", "<<#y<<"="<<(y)<<", "<<#z<<"="<<(z)<<", "<<#r<<"="<<(r)<<endl
using namespace std;

typedef struct
{
    int weight,ind;
}mice;

int main(void)
{
    #ifdef test
    freopen("in.txt","r",stdin);
    //freopen("in.txt","w",stdout);
    clock_t start=clock();
    #endif //test

    int np,ng;scanf("%d%d",&np,&ng);
    mice num[np],cnt[np];
    int ans[np]={0},que[np]={0};
    int t=np;
    for(int i=0;i<np;++i)
        scanf("%d",&num[i].weight),num[i].ind=i;
    for(int i=0;i<np;++i)
        scanf("%d",&que[i]);

    int tt=0;
    int ind=0,val;
    if(t%ng!=0)val=t/ng+2;
    else val=t/ng+1;
    for(int i=0;i<t;i=i+ng)
    {
        int temp=num[que[i]].weight,index=i,r=min(i+ng,t);
        for(int j=i+1;j<r;++j)
        {
            if(num[que[j]].weight>temp)temp=num[que[j]].weight,index=j;
        }
        for(int j=i;j<r;++j)
        {
            if(j!=index)ans[num[que[j]].ind]=val;
        }
        cnt[tt]=num[que[index]];
        tt++;
    }
    t=tt,tt=0;
    for(int i=0;i<t;++i)
        num[i]=cnt[i];

    while(t>1)
    {
        ind=0;
        if(t%ng!=0)val=t/ng+2;
        else val=t/ng+1;

        for(int i=0;i<t;i=i+ng)
        {
            int temp=num[i].weight,index=i,r=min(i+ng,t);
            for(int j=i+1;j<r;++j)
            {
                if(num[j].weight>temp)temp=num[j].weight,index=j;
            }
            for(int j=i;j<r;++j)
            {
                if(j!=index)ans[num[j].ind]=val;
            }
            cnt[tt]=num[index];
            tt++;
        }
        for(int i=0;i<tt;++i)
            num[i]=cnt[i];
        t=tt,tt=0;
    }
    ans[num[0].ind]=1;
    for(int i=0;i<np;++i)
    {
        if(!i)printf("%d",ans[i]);
        else printf(" %d",ans[i]);
    }
    printf("\n");

    #ifdef test
    clockid_t end=clock();
    double endtime=(double)(end-start)/CLOCKS_PER_SEC;
    printf("\n\n\n\n\n");
    cout<<"Total time:"<<endtime<<"s"<<endl;        //s为单位
    cout<<"Total time:"<<endtime*1000<<"ms"<<endl;    //ms为单位
    #endif //test
    return 0;
}


原文地址:https://blog.csdn.net/2401_88085478/article/details/143830590

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!