题解
【入门】排序
5 条题解
-
0
#include <bits/stdc++.h> using namespace std; struct stu { int h, w; }a[3005]; int main(){ int n, ans = 0; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].h >> a[i].w; } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (a[i].h < a[j].h || a[i].h == a[j].h && a[i].w < a[j].w) { ans++; } } } cout << ans; return 0; } -
0
#include <bits/stdc++.h> using namespace std; int a[25], b[25] = {1, 1}, c[25], d[25], m1[405][3]; // a: 当前排列状态, b: 排序后的状态, c: 用于比较的状态, m1: 存储约束关系的数组 int main() { int T; // 测试用例数量 cin >> T; // 从标准输入读取测试用例数量 while (T--) { // 对每个测试用例进行处理 int n, m; // n: 元素数量, m: 约束关系数量 cin >> n >> m; // 从输入读取 n 和 m 的值 // 初始化数组 a memset(a,0,sizeof a); // 读取约束关系 for (int i = 1; i <= m; i++) { cin >> m1[i][1] >> m1[i][2]; // 读取每个约束关系 } bool f = 0; // 标志变量,表示是否存在不满足的情况 // 遍历所有可能的前 i 个元素 for (int i = 1; i <= n; i++) { // 初始化 a 数组,前 i 个元素设为 1,其余设为 0 for (int j = 1; j <= n; j++) a[j] = 0; for (int j = 1; j <= i; j++) { a[j] = 1; // 将前 i 个元素标记为 1 } // 对于每个可能的排列 for (int l = 1; l <= n; l++) { for (int j = 1; j <= n - 1; j++) { // 复制当前状态到 c 和 b for (int k = 1; k <= n; k++) { c[k] = a[k]; // 复制当前状态到 c b[k] = a[k]; // 复制当前状态到 b } sort(b + 1, b + 1 + n); // 对 b 进行排序 // 根据约束关系调整 c for (int k = 1; k <= m; k++) { if (c[m1[k][1]] > c[m1[k][2]]) { // 如果 c 中的元素不满足约束 swap(c[m1[k][1]], c[m1[k][2]]); // 交换元素以满足约束 } } // 检查 c 是否与 b 相同 for (int k = 1; k <= n; k++) { if (b[k] != c[k]){ f = 1; // 如果不相同,设置标志为 1 } } swap(a[j], a[j + 1]); // 交换 a 中的元素以生成新的排列 } } } // 根据标志变量 f 输出结果 if (f == 0){ cout << "YES" << endl; // 如果没有不满足的情况,输出 "YES" } else{ cout << "NO" << endl; // 否则输出 "NO" } } } -
0
#include <bits/stdc++.h> using namespace std; struct fh { string n; int s; }a[101]; bool cmp(fh x, fh y) { if (x.n.size() != y.n.size()) { return x.n.size() > y.n.size(); } else if (x.n != y.n) { return x.n > y.n; } else { return x.s > y.s; } } int main() { int m; cin >> m; for (int i = 1; i <= m; i++) { cin >> a[i].s >> a[i].n; } sort(a + 1, a + m + 1, cmp); for (int i = 1; i <= m; i++) { cout << a[i].s << " " << a[i].n << endl; } return 0; } -
0
#include <bits/stdc++.h> using namespace std; struct stu { int h; int w; }a[3005]; int main() { int n, ans = 0; cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i].h >> a[i].w; } for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { // 目标排序规则:身高从高到低,身高相同则体重从重到轻 // 该条件判断:原始序列中,第i位同学 比 第j位同学 "更靠后"(不符合目标顺序),构成逆序对 // 解读条件: // 1. a[i].h < a[j].h:i的身高比j矮 → 目标中j应在i前面,当前i在j前面,构成逆序对 // 2. (a[i].h == a[j].h && a[i].w < a[j].w):i和j身高相同,i的体重比j轻 → 目标中j应在i前面,当前i在j前面,构成逆序对 // 每发现一个逆序对,交换次数ans加1(相邻交换消除一个逆序对需要1次操作) if (a[i].h < a[j].h || (a[i].h == a[j].h && a[i].w < a[j].w)) { ans++; } } } cout << ans; return 0; } -
0
#include<bits/stdc++.h> using namespace std; vector<int>a[1005]; int main(){ int n,c,x; cin>>n; for(int i=0;i<n;i++){ cin>>c; for(int j=0;j<c;j++){//数组大小 cin>>x; a[i].push_back(x); } //对当前数组排序 sort(a[i].begin(),a[i].end()); } sort(a,a+n);//对所有数组排序 for(int i=0;i<n;i++){ for(int j=0;j<a[i].size();j++){ cout<<a[i][j]<<" "; } cout<<endl; } return 0; }
- 1