记录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
突破点
第一行按照从小到大的顺序输出所有女生的身高;
第二行按照从小到大的顺序输出所有男生的身高。
注意在输出身高时,请按照原来的身高保留对应的小数点位数。
思路
- 将男生女生分到不同的数组里面
- 将数组进行一个由小到大的输出
代码简析
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. 宽度、对齐与填充
指定最小宽度(右对齐)
cppprintf("%5d\n", 42); // 输出" 42"(占5位,不足补空格) printf("%10s\n", "hi"); // 输出" hi"左对齐(加
-标志)
cppprintf("%-5d\n", 42); // 输出"42 "(左对齐) printf("%-10s\n", "hi");// 输出"hi "补零(加
0标志)
cppprintf("%05d\n", 42); // 输出"00042"(补零) printf("%08d\n", 123); // 输出"00000123"
4. 精度控制
浮点数精度
cppprintf("%.2f\n", 3.14159); // 保留2位小数:3.14 printf("%.4f\n", 3.14159); // 保留4位小数:3.1416(自动四舍五入)字符串长度限制
cppprintf("%.5s\n", "hello world"); // 输出"hello"(只取前5个字符)
5. 标志字符(组合使用)
标志 作用 示例 输出 -左对齐 %-5d42+显示正负号 %+d+42、-42(空格) 正数前加空格 % d42、-420补零 %05d00042#显示进制前缀 %#x0xff组合示例:
cppprintf("%+05d\n", 42); // 输出"+0042" printf("%-8.2f\n", 3.14);// 输出"3.14 "(左对齐,占8位)
6. 长度修饰符(处理类型)
修饰符 适用类型 示例 说明 llong%ld长整数 lllong long%lld长长整数 hshort%hd短整数 Llong double%Lf长双精度浮点数
long long x = 1234567890123LL; printf("%lld\n", x); // 必须加ll,否则输出错误
7. 转义字符(特殊输出)
转义字符 含义 效果 \n换行 光标移到下一行行首 \t制表符 跳到下一个Tab位置(通常8字符) \\反斜杠 输出 \\"双引号 输出 "\0空字符 字符串结束标志 \r回车 光标回到当前行行首(Windows换行用 \r\n)
cppprintf("第一行\n第二行\n"); // 输出两行 printf("列1\t列2\t列3\n"); // 输出三列对齐 printf("路径:C:\\Users\\test\n"); // 输出:C:\Users\test
8. 多参数输出(按顺序对应)
cppint 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 元
核心要点总结(背诵)
头文件 :
<cstdio>或<stdio.h>格式 :
"文字%说明符"+ 按顺序提供参数整数 :
int用%d,long long用%lld浮点 :
%f(默认6位),%.2f(保留2位)字符串 :
%s,注意必须以\0结尾对齐 :
%5d(右对齐5位),%-5d(左对齐)补零 :
%05d输出"00042"特殊 :
%%输出百分号,\\输出反斜杠竞赛箴言 :写
printf时,默念"类型对了吗?顺序对吗?几个%?",可避免90%的错误。