C32-9.21sort排序2
原题链接:38471.note12025-09-21 18:55:53
发布于:江苏
T1 小码君拼数
#include <bits/stdc++.h>
using namespace std;
string a[105];
int n;
bool cmp(string x, string y){
return x+y > y+x;
}
int main(){
cin >> n;
for (int i=0; i<n; i++) cin>>a[i];
sort(a, a+n, cmp);
for (int i=0; i<n; i++) cout<<a[i];
return 0;
}
/*
题目描述
小码君有 n 个正整数,
他想尝试将这 n 个数重新排成一排,
使得相邻的数字首尾连接,请你帮他计算出能组成的最大数字。
提示
【数据范围】
1≤n≤20
1≤a[i]≤1000
输入格式
输入共两行。
第一行一个整数 n,表示整数数量。
第二行 n 个整数,a[i]表示第 i 个整数的数值。
输出格式
输出一行一个整数,表示小码君能组成的最大数字。
样例组
输入#1
3
13 312 343
输出#1
34331213
*/
T2 小码君的随机数
#include <bits/stdc++.h>
using namespace std;
int b[1005], n, t;
int main(){
cin >> n;
for (int i=1; i<=n; i++){
cin >> t;
b[t] ++;
}
int cnt = 0;
for (int i=1; i<=1000; i++){
if (b[i]) cnt++;
}
cout << cnt << endl;
//输出不重复的数字
for (int i=1; i<=1000; i++){
if(b[i]) cout<<i << ' ';
}
return 0;
}
/*
题目描述
小码君想在学校中请一些同学一起做一项问卷调查,
为了实验的客观性,
他先用计算机生成了 N 个 1 到 1000 之间的随机整数 (N≤100),
对于其中重复的数字,只保留一个,把其余相同的数去掉,
不同的数对应着不同的学生的学号。
然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。
请你协助小码君完成“去重”与“排序”的工作。
输入格式
输入有两行,第 1 行为 1 个正整数,表示所生成的随机数的个数 N。
第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。
输出格式
输出也是两行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。
第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。
样例组
输入#1
10
20 40 32 67 40 20 89 300 400 15
输出#1
8
15 20 32 40 67 89 300 400
输入#2
7
40 32 67 40 89 300 400
输出#2
6
32 40 67 89 300 400
*/
T3 可爱的猫咪
#include <iostream>
#include <algorithm>
using namespace std;
int a[1010]; // 存储猫咪的邪恶指数
int temp[1010]; // 临时数组,用于存储查询区间内的数
int main() {
int n, m;
cin >> n >> m; // 输入猫咪数量 n 和查询次数 m
for (int i = 1; i <= n; i++) {
cin >> a[i]; // 输入每只猫咪的邪恶指数
}
for (int i = 1; i <= m; i++) {
int l, r, k;
cin >> l >> r >> k; // 输入查询区间 [l, r] 和第 k 小
int index = 0;
for (int j = l; j <= r; j++) {
index++;
temp[index] = a[j]; // 将区间 [l, r] 内的数复制到 temp 数组中
}
sort(temp + 1, temp + index + 1); // 对 temp 数组排序
cout << temp[k] << endl; // 输出第 k 小的数
}
return 0;
}
【时间复杂度分析】
T4 小码君的演习
soming soon...
#include <bits/stdc++.h>
using namespace std;
int n, t, a[10005];
int main(){
cin >> n >> t;
for (int i=1; i<=n; i++){
cin >> a[i];
}
while (t--){
int l, r;
cin >> l >> r;
sort (a+l, a+r+1);
for (int i=1; i<=n; i++){
cout<<a[i]<<' ';
}
cout << endl;
}
return 0;
}
/*
小码君拿到了 n 张数字牌,为了公平起见,分发前他会洗牌 t 次。
每次洗牌会按照给出的范围 [l,r] 对数字牌进行升序排列
(即:将第 l 张到第 r 张数字牌按照数字大小升序排列)。
请你帮他打印出每次洗牌后数字牌的排序结果
(输出数字牌对应的数值)。
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N], n;
//自定义比较规则
bool cmp(int x, int y){
int sx = x/10%10, sy = y/10%10;
if (sx != sy) return sx > sy; //按照十位大的数字排序
else return x > y; //否则按照数字大小排序
}
int main(){
cin >> n;
for (int i=1; i<=n; i++) cin>>a[i];
sort(a+1, a+1+n, cmp);
for (int i=1; i<=n; i++)
cout<<a[i]<<' ';
return 0;
}
/*
题目描述
小码君又得到了 n 张数字牌,这次他希望按照数字牌的十位数值来进行洗牌。
请你帮他打印出最后的数字牌顺序(即对应数值)。
洗牌规则:按照数字牌十位上的数值排序,十位值较大的数在前。
若十位值相等则按照数字牌本身数值大小排序,数值大的在前。
例如:5、23、123、145,5 的十位数为 0,23 和 123 的十位数均为 2,
145 的十位数为 4,所以洗牌后的顺序为:145、123、23、5。
提示
【数据范围】
1≤n,a ≤100000
输入格式
输入共两行。
第一行一个整数 n,表示数字牌的数量。
第二行 n 个整数,a[i]表示第 i 张数字牌的数字大小。
输出格式
输出一行,表示最终数字牌顺序。
样例组
输入#1
6
12 23 14 123 5 145
输出#1
145 123 23 14 12 5
*/
这里空空如也
有帮助,赞一个