坑人小能手——题解 P5412 【[YNOI2019]排队】

· · 题解

做题前:这题真的省选?

做题后:真有坑点……

题目大意

小明所在的班级要举办一场课外活动,在活动开始之前老师告诉小明:“需要把男女生分成两队,并且每一队都要按照身高从矮到高进行排序”。但是由于小明的马虎,没有把老师的安排转达给同学,导致全班同学已经排成了一列。活动马上要开始了,小明的老师对此很困扰,你能帮帮她吗?

给出两组浮点数,进行从大到小排序。

进行这一操作其实相当简单。我们只要先用一个数组mem记录给出的性别,然后循环,按性别将男女生身高存入不同的数组(b和g),再对b和g进行sort排序就好了。

像这样\downarrow

sort(g,g+gn,less<float>());//给g女生数组从小到大排序 
sort(b,b+bn,less<float>());//给b男生数组从小到大排序 

但是这道题目有一些坑点要和各位谈一谈……

1.由于会一次给出T组数据,所以每次循环做一组新的数据时要记得清空上一次的数据。

memset(b,0,sizeof(b));//男生数组 
memset(g,0,sizeof(g));//女生数组 
memset(mem,0,sizeof(mem));//性别记忆数组 
bn=0;//男生数量 
gn=0;//女生数量 

2.题目给的是浮点数,要注意输入。

float b[100001],g[100001],mem[100001];
for (int j=0;j<n;++j){
    scanf("%f",&mem[j]);//%f输入实数 
}

3.题目没说要输出一位小数!

你知道没注意到这一点会怎么样嘛…… 可以像我一样,输入scanf,输出cout完事…… 读入几位小数cout就会输出几位。

for (int j=0;j<gn;++j){
    cout<<g[j]<<" ";
}
printf("\n");
for (int j=0;j<bn;++j){
    cout<<b[j]<<" ";
}
printf("\n");

下面给上标程 祝大家切省选题愉快XDDD

//Luogu Prob 5412
#include<bits/stdc++.h>
using namespace std;
int t,n,bn=0,gn=0;
float b[100001],g[100001],mem[100001];
int main(){
    //freopen("in.txt","r",stdin);//文件操作,不用管它,调试用 
    //freopen("out.txt","w",stdout);
    scanf("%d",&t);
    for (int i=0;i<t;++i){
        memset(b,0,sizeof(b));//男生数组 
        memset(g,0,sizeof(g));//女生数组 
        memset(mem,0,sizeof(mem));//性别记忆数组 
        bn=0;//男生数量 
        gn=0;//女生数量 
        scanf("%d",&n);
        for (int j=0;j<n;++j){
            scanf("%f",&mem[j]);//%f输入实数 
        }
        for (int j=0;j<n;++j){//男女分组 
            if (mem[j]==0){
                scanf("%f",&g[gn++]);
            }else{
                scanf("%f",&b[bn++]);
            }
        }
        sort(g,g+gn,less<float>());//给g女生数组从小到大排序 
        sort(b,b+bn,less<float>());//给b男生数组从小到大排序 
        for (int j=0;j<gn;++j){
            cout<<g[j]<<" ";
        }
        printf("\n");//记得换行 
        for (int j=0;j<bn;++j){
            cout<<b[j]<<" ";
        }
        printf("\n");
    }
    //fclose(stdin);fclose(stdout);//也是文件操作 
    return 0;
}