《B4361 [GESP202506 四级] 排序》
2026/6/19 11:22:58 网站建设 项目流程

题目背景

对应的选择、判断题:试题 - GESP 202506 C++ 四级 - 洛谷有题

题目描述

体育课上有 n 名同学排成一队,从前往后数第 i 位同学的身高为 hi​,体重为 wi​。目前排成的队伍看起来参差不齐,老师希望同学们能按照身高从高到低的顺序排队,如果身高相同则按照体重从重到轻排序。在调整队伍时,每次只能交换相邻两位同学的位置。老师想知道,最少需要多少次交换操作,才能将队伍调整成目标顺序。

输入格式

第一行,一个正整数 n,表示队伍人数。

接下来 n 行,每行两个正整数 hi​ 和 wi​,分别表示第 i 位同学的身高和体重。

输出格式

输出一行,一个整数,表示最少需要的交换次数。

输入输出样例

输入 #1复制

5 1 60 3 70 2 80 4 55 4 50

输出 #1复制

8

输入 #2复制

5 4 0 4 0 2 0 3 0 1 0

输出 #2复制

1

说明/提示

对于所有测试点,保证 1≤n≤3000,0≤hi​,wi​≤109。

代码实现:

#include <iostream> #include <vector> #include <algorithm> using namespace std; struct Person { long long h,w; }; bool cmp(const Person &a,const Person &b) { if(a.h!=b.h) return a.h>b.h; return a.w>b.w; } int main() { int n; cin>>n; vector<Person> ori(n),srt; for(int i=0;i<n;i++) { cin>>ori[i].h>>ori[i].w; } srt=ori; sort(srt.begin(),srt.end(),cmp); vector<int> a(n); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(ori[i].h==srt[j].h&&ori[i].w==srt[j].w) { a[i]=j; break; } } } long long ans=0; for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(a[i]>a[j]) ans++; } } cout<<ans; return 0; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询