题目背景
对应的选择、判断题:试题 - 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; }