PAT甲题题解-1109. Group Photo (25)-(模拟拍照排队)

题意:n个人,要拍成k行排队,每行 n/k人,多余的都在最后一排。

从第一排到最后一排个子是逐渐增高的,即后一排最低的个子要>=前一排的所有人

每排排列规则如下:

1.中间m/2+1为该排最高;

2.其他人按各自降序顺序,轮流排到中间最高的左边和右边;

举个例子 190 188 186 175 170

— — 190 — —

— 188 190 — —

— 188 190 186 —

175 188 190 186 —

175 188 190 186 170

3.当个子一样高时,名字按字典序顺序,靠前的先排入队伍。

纯粹模拟,没啥好说的。

#include <iostream>
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=10000+5;

struct People{
    char str[20];
    int height;
    bool operator<(const People tmp)const{
        if(height==tmp.height){
            if(strcmp(str,tmp.str)<0)
                return false;
            else
                return true;
        }
        else{
            return height<tmp.height;
        }
    }
}people[maxn];
int main()
{
    int k,n;
    scanf("%d %d",&n,&k);
    int ans[k+1][maxn];
    int cols[k+1];
    for(int i=0;i<n;i++){
        scanf("%s %d",people[i].str,&people[i].height);
    }
    sort(people,people+n);

    int m=n/k;
    int left,right;
    for(int i=1;i<=k;i++){
        left=(i-1)*m;
        right=i*m-1;
        if(i==k){
            m=n-(k-1)*m;
            right=n-1;
        }
        cols[i]=m;
        int center=m/2+1;
        int idx=right;
        ans[i][center]=idx;
        idx--;
        int l=center-1,r=center+1;
        while(r<=m){
            ans[i][l]=idx;
            idx--;
            ans[i][r]=idx;
            idx--;
            l--;r++;
        }
        if(l==1)
            ans[i][1]=idx;
    }
    for(int i=k;i>=1;i--){
        for(int j=1;j<=cols[i];j++){
            if(j==01){
                printf("%s",people[ans[i][j]].str);
            }
            else{
                printf(" %s",people[ans[i][j]].str);
            }
        }
        printf("\n");
    }
    return 0;
}

时间: 2024-10-12 16:23:00

PAT甲题题解-1109. Group Photo (25)-(模拟拍照排队)的相关文章

PAT甲题题解-1016. Phone Bills (25)-模拟、排序

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789229.html特别不喜欢那些随便转载别人的原创文章又不给出链接的所以不准偷偷复制博主的博客噢~~ 给出一天24小时内,每个小时内,每分钟的通话费用给出n个记录,on-line表示通话的开始,off-line表示通话的结束如果on-line/off-line没有对应的另一个,忽略即可 先按人名排序,名称一样的按时间排序,这里时间统一按分钟来算,即一天有24

PAT甲题题解-1101. Quick Sort (25)-大水题

快速排序有一个特点,就是在排序过程中,我们会从序列找一个pivot,它前面的都小于它,它后面的都大于它.题目给你n个数的序列,让你找出适合这个序列的pivot有多少个并且输出来. 大水题,正循环和倒着循环一次,统计出代码中的minnum和maxnum即可,注意最后一定要输出'\n',不然第三个测试会显示PE,格式错误. #include <iostream> #include <cstdio> #include <algorithm> #include <map&

PAT甲题题解-1130. Infix Expression (25)-中序遍历

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789828.html特别不喜欢那些随便转载别人的原创文章又不给出链接的所以不准偷偷复制博主的博客噢~~ 水,中序遍历输出即可注意除根节点.叶子节点外,都需要有括号括起来 #include <iostream> #include <cstdio> #include <algorithm> #include <string>

PAT甲题题解-1051. Pop Sequence (25)-堆栈

将1~n压入最多为m元素的栈 给出k个出栈序列,问你是否能够实现. 能输出YES 否则NO 模拟一遍即可,水题. #include <iostream> #include <cstdio> #include <string.h> #include <algorithm> using namespace std; const int maxn=1005; int m,n,k; int seq[maxn]; int stacks[maxn]; int rear=

PAT甲题题解-1114. Family Property (25)-(并查集模板题)

题意:给出每个人的家庭成员信息和自己的房产个数与房产总面积,让你统计出每个家庭的人口数.人均房产个数和人均房产面积.第一行输出家庭个数,随后每行输出家庭成员的最小编号.家庭人口数.人均房产个数.人均房产面积. 并查集,合并的时候编号小的作为父亲节点,最后父亲节点一样的即属于一个家庭,其它都是细节处理没啥好说了. #include <iostream> #include <cstdio> #include <algorithm> #include <string.h

PAT甲题题解-1121. Damn Single (25)-水题

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789787.html特别不喜欢那些随便转载别人的原创文章又不给出链接的所以不准偷偷复制博主的博客噢~~ 给出n个couple和m个宾客如果宾客没有couple或者couple没来,则被认为lonely问你有多少个lonely的宾客,并且按照id的升序输出 #include <iostream> #include <cstdio> #include

PAT甲题题解-1037. Magic Coupon (25)-贪心,水

题目说了那么多,就是给你两个序列,分别选取元素进行一对一相乘,求得到的最大乘积. 将两个序列的正和负数分开,排个序,然后分别将正1和正2前面的相乘,负1和负2前面的相乘,累加和即可. #include <iostream> #include <cstdio> #include <algorithm> #include <string.h> #include <cmath> #include <vector> using namespa

PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算

输入为两个分数,让你计算+,-,*,\四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出如果为负数,则带分数两边要有括号如果除数为0,则式子中的结果输出Inf模拟题最好自己动手实现,考验细节处理,其它没啥好说的. #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; long long numerato

PAT甲题题解-1042. Shuffling Machine (20)-模拟

博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789205.html特别不喜欢那些随便转载别人的原创文章又不给出链接的所以不准偷偷复制博主的博客噢~ 给出洗牌次数,以及洗牌的序列规则第i个数shuffles[i]表示要将第i张牌移到第shuffles[i]个 很简单,就是shuffle_seq[shuffles[i]]=start_seq[i]; #include <iostream> #include