top1编程
← 返回题目
题解

【入门】排序

5 条题解

  • 0
    @ 2026-7-29 0:06:30
    #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
      @ 2026-7-29 0:06:28
      #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
        @ 2026-7-29 0:06:26
        #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
          @ 2026-7-28 22:10:31
          #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
            @ 2026-7-28 22:09:32
            #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