P5412 [YNOI2019] 排队

记录42

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int T,n,sex,bn,gn,t[2010]={};
	double b[2010]={},g[2010]={},h;
	cin>>T;
	while(T--){
		cin>>n;
		bn=0;
		gn=0;
		for(int i=0;i<n;i++) cin>>t[i];
		for(int i=0;i<n;i++){
			cin>>h;
			if(t[i]==0)	g[gn++]=h;
			else b[bn++]=h;	
		}
		sort(g,g+gn);
		for(int i=0;i<gn;i++) cout<<g[i]<<" ";
		cout<<endl;
		sort(b,b+bn);
		for(int i=0;i<bn;i++) cout<<b[i]<<" ";
		cout<<endl;
	}
	return 0;
} 

题目传送门https://www.luogu.com.cn/problem/P5412


突破点

第一行按照从小到大的顺序输出所有女生的身高;

第二行按照从小到大的顺序输出所有男生的身高。

注意在输出身高时,请按照原来的身高保留对应的小数点位数。


思路

  1. 将男生女生分到不同的数组里面
  2. 将数组进行一个由小到大的输出

代码简析

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int T,n,sex,bn,gn,t[2010]={};
	double b[2010]={},g[2010]={},h;
	...
	return 0;
} 

T 是几组数据 n 是总人数 sex 代表性别

bn 男生人数 gn 女生人数 t2010={} 存放男女生性别

b2010={},g2010={},h; 男生身高存储 女生身高存储 正在输入的身高

注意:身高是浮点数

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	int T,n,sex,bn,gn,t[2010]={};
	double b[2010]={},g[2010]={},h;
	cin>>T;
	while(T--){
		cin>>n;
		bn=0;
		gn=0;
		for(int i=0;i<n;i++) cin>>t[i];
		for(int i=0;i<n;i++){
			cin>>h;
			if(t[i]==0)	g[gn++]=h;
			else b[bn++]=h;	
		}
		sort(g,g+gn);
		for(int i=0;i<gn;i++) cout<<g[i]<<" ";
		cout<<endl;
		sort(b,b+bn);
		for(int i=0;i<bn;i++) cout<<b[i]<<" ";
		cout<<endl;
	}
	return 0;
} 

双数组计数分组

男生分一组,女生分一组

sort()来对两个数组由小到大排序


补充

printf 常规用法完全指南


1. 基础语法与头文件

cpp 复制代码
#include <cstdio>  // C++风格
// 或 #include <stdio.h>  // C风格

printf("格式字符串", 参数1, 参数2, ...);
  • 格式字符串 :包含普通字符和格式说明符(%开头)

  • 参数:变量或常量,数量与说明符一致,顺序对应


2. 核心格式说明符(必背)

说明符 输出类型 示例 输出结果
%d 十进制整数 printf("%d", 123); 123
%c 单个字符 printf("%c", 'A'); A
%s 字符串 printf("%s", "hello"); hello
%f 浮点数 printf("%f", 3.14); 3.140000(默认6位小数)
%.2f 保留2位小数 printf("%.2f", 3.14159); 3.14
%x 十六进制(小写) printf("%x", 255); ff
%X 十六进制(大写) printf("%X", 255); FF
%o 八进制 printf("%o", 8); 10
%p 指针地址 printf("%p", &a); 0x7ffee3b8
%% 输出百分号 printf("%%"); %

3. 宽度、对齐与填充

指定最小宽度(右对齐)
cpp 复制代码
printf("%5d\n", 42);    // 输出"   42"(占5位,不足补空格)
printf("%10s\n", "hi"); // 输出"        hi"
左对齐(加-标志)
cpp 复制代码
printf("%-5d\n", 42);   // 输出"42   "(左对齐)
printf("%-10s\n", "hi");// 输出"hi        "
补零(加0标志)
cpp 复制代码
printf("%05d\n", 42);   // 输出"00042"(补零)
printf("%08d\n", 123);  // 输出"00000123"

4. 精度控制

浮点数精度
cpp 复制代码
printf("%.2f\n", 3.14159);  // 保留2位小数:3.14
printf("%.4f\n", 3.14159);  // 保留4位小数:3.1416(自动四舍五入)
字符串长度限制
cpp 复制代码
printf("%.5s\n", "hello world");  // 输出"hello"(只取前5个字符)

5. 标志字符(组合使用)

标志 作用 示例 输出
- 左对齐 %-5d 42
+ 显示正负号 %+d +42、-42
(空格) 正数前加空格 % d 42、-42
0 补零 %05d 00042
# 显示进制前缀 %#x 0xff

组合示例:

cpp 复制代码
printf("%+05d\n", 42);   // 输出"+0042"
printf("%-8.2f\n", 3.14);// 输出"3.14    "(左对齐,占8位)

6. 长度修饰符(处理类型)

修饰符 适用类型 示例 说明
l long %ld 长整数
ll long long %lld 长长整数
h short %hd 短整数
L long double %Lf 长双精度浮点数
复制代码
long long x = 1234567890123LL;
printf("%lld\n", x);  // 必须加ll,否则输出错误

7. 转义字符(特殊输出)

转义字符 含义 效果
\n 换行 光标移到下一行行首
\t 制表符 跳到下一个Tab位置(通常8字符)
\\ 反斜杠 输出\
\" 双引号 输出"
\0 空字符 字符串结束标志
\r 回车 光标回到当前行行首(Windows换行用\r\n)
cpp 复制代码
printf("第一行\n第二行\n");    // 输出两行
printf("列1\t列2\t列3\n");     // 输出三列对齐
printf("路径:C:\\Users\\test\n");  // 输出:C:\Users\test

8. 多参数输出(按顺序对应)

cpp 复制代码
int a = 10;
float b = 3.14f;
char c = 'X';
printf("a=%d, b=%.2f, c=%c\n", a, b, c);
// 输出:a=10, b=3.14, c=X

// 参数必须按顺序匹配
printf("%d%s%f\n", 1, "hello", 2.5);  // 输出:1hello2.500000

9. 常见错误与调试

错误类型 错误代码 结果 正确做法
类型不匹配 printf("%d", 3.14); 输出乱码 printf("%f", 3.14);
参数数量不足 printf("%d%d", 5); 输出随机数 提供两个参数
参数过多 printf("%d", 5, 10); 忽略多余参数 删除多余参数
漏写格式说明符 printf("score: ", 100); 不输出100 printf("score: %d", 100);
字符串无结束符 char s[] = {'h','i'}; printf("%s", s); 越界输出乱码 确保字符串以\0结尾

10. 实用示例模板

cpp 复制代码
// 示例1:格式化成绩表
printf("学号:%6d  姓名:%-10s  成绩:%3d\n", 101, "Alice", 95);
// 输出:学号:   101  姓名:Alice     成绩: 95

// 示例2:输出进度百分比
for (int i = 0; i <= 100; i += 10) {
    printf("\r进度:%3d%%", i);  // \r回到行首,覆盖输出
}
// 效果:进度: 10% → 进度: 20% → ... → 进度:100%

// 示例3:金额千位分隔(C++17起支持)
printf("总金额:%'d 元\n", 1234567);  // 输出:总金额:1,234,567 元

核心要点总结(背诵)

  1. 头文件 :<cstdio> 或 <stdio.h>

  2. 格式 :"文字%说明符" + 按顺序提供参数

  3. 整数 :int用%d,long long用%lld

  4. 浮点 :%f(默认6位),%.2f(保留2位)

  5. 字符串 :%s,注意必须以\0结尾

  6. 对齐 :%5d(右对齐5位),%-5d(左对齐)

  7. 补零 :%05d输出"00042"

  8. 特殊 :%%输出百分号,\\输出反斜杠

竞赛箴言 :写printf时,默念"类型对了吗?顺序对吗?几个%?",可避免90%的错误。

相关推荐
Logic10120 分钟前
C语言/数据结构排序题解:三个数的最大乘积——排序后比较两种候选情况
c语言·数据结构·数组·排序·时间复杂度·算法题·负数处理
知识分享小能手23 分钟前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习
无忧.芙桃32 分钟前
位图妙用:512MB 实现 40 亿整数的存在性查询
c语言·c++·面试·哈希算法
ShineWinsu44 分钟前
对于Redis:Steam、Geospatial、Hyperloglog、Bitmap、Bitfield类型的解析
数据库·c++·redis·分布式·缓存·面试·zset
朝朝辞暮i1 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
殷色玫瑰1 小时前
C++ string类详解:常用接口、字符串操作与模拟实现
java·linux·c语言·开发语言·数据结构·c++
李游Leo2 小时前
HarmonyOS 7 + Spatial Recon Kit-C++:3DGS 高斯参数的非有限值隔离与可渲染性门禁【鸿蒙心迹】
开发语言·c++·3d·harmonyos
Evand J2 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
海绵宝宝转agent2 小时前
leetCode100算法开源笔记分享
笔记·算法
jimy12 小时前
基类没有虚析构函数,基类指针删除派生类对象,行为是未定义的
开发语言·c++