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 女生人数 t[2010]={} 存放男女生性别

b[2010]={},g[2010]={},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%dlong long%lld

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

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

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

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

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

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

相关推荐
数字化脑洞实验室35 分钟前
智能决策与决策优化:从算法到产业的演进逻辑
算法
kingmax542120081 小时前
图论核心算法(C++):包括存储结构、核心思路、速记口诀以及学习方法, 一站式上机考试学习【附PKU百练,相关练习题单】
c++·算法·图论·信奥赛·上机考试·百练·pku
罗湖老棍子1 小时前
【例9.15】潜水员(信息学奥赛一本通- P1271)
c++·算法·动态规划·二维费用背包
_OP_CHEN1 小时前
算法基础篇:(二十一)数据结构之单调栈:从原理到实战,玩转高效解题
数据结构·算法·蓝桥杯·单调栈·算法竞赛·acm/icpc
代码游侠2 小时前
学习笔记——数据结构学习
linux·开发语言·数据结构·笔记·学习
xuanzdhc2 小时前
Gitgit
java·linux·运维·服务器·c++·git
q***51892 小时前
【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展
算法·架构
程小k2 小时前
迷你编译器
c++·编辑器
蘑菇小白3 小时前
数据结构--链表
数据结构·链表