坑人小能手——题解 P5412 【[YNOI2019]排队】
Starwings33 · · 题解
做题前:这题真的省选?
做题后:真有坑点……
题目大意
小明所在的班级要举办一场课外活动,在活动开始之前老师告诉小明:“需要把男女生分成两队,并且每一队都要按照身高从矮到高进行排序”。但是由于小明的马虎,没有把老师的安排转达给同学,导致全班同学已经排成了一列。活动马上要开始了,小明的老师对此很困扰,你能帮帮她吗?
给出两组浮点数,进行从大到小排序。
进行这一操作其实相当简单。我们只要先用一个数组mem记录给出的性别,然后循环,按性别将男女生身高存入不同的数组(b和g),再对b和g进行sort排序就好了。
像这样
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;
}