冒泡排序,每次交换即为调转车厢,ans++
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[10000];
int ans;
int main(){
cin >> n;
for(int i = 1;i <= n; i++) cin >> a[i];
for(int i = 1;i <= n; i++){
for(int j = 1;j <= n - i; j++){
if(a[j] > a[j+1]){
swap(a[j],a[j+1]);
ans++;
}
}
}
cout << ans << endl;
return 0;
}
归并排序。合并的时候,被放进去的数字右边的所有数字都可以组成逆序对。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
long long ans = 0;
int a[500400];
int b[500400];
int L[500400],R[500400];
int RT = 0;
void msort(int l,int r){
if(l == r) return;
int mid = (l+r) >>1;
msort(l,mid);
msort(mid+1,r);
int i = l,j = mid + 1;
int cnt = l;
while(j <= r && i <= mid){
if(a[i] > a[j]){
ans += mid - i + 1;
b[cnt++] = a[j++];
}
if(a[i] <= a[j]){
b[cnt++] = a[i++];
}
}
while(j <= r)
b[cnt++] = a[j++];
while(i <= mid)
b[cnt++] = a[i++];
for(int i = l;i <= r; i++)
a[i] = b[i];
}
int main(){
cin >> n;
for(int i = 1;i <= n; i++){
cin >> a[i];
}
msort(1,n);
cout << ans << endl;
return 0;
}
这个就很水了就不说了
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
struct STU{
int num;
double sco;
}stu[1000];
bool cmp(STU a,STU b){
return a.sco > b.sco;
}
int main(){
cin >> n >> k;
for(int i = 1;i <= n; i++)
cin >> stu[i].num >> stu[i].sco;;
sort(stu + 1,stu + 1 + n,cmp);
cout << stu[k].num << ' ' << stu[k].sco << endl;
return 0;
}
这个也挺水,直接把偶数扔掉就好了
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n;
int a[1000];
int main(){
int tot = 1;
cin >> n;
for(int i = 1;i <= n; i++){
int f;
cin >> f;
if(f % 2)
a[tot++] = f;
}
tot--;
sort(a+1,a+tot+1);
for(int i = 1;i <= tot;i++){
cout << a[i];
if(i != tot) cout <<',';
}
return 0;
}
水题
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
struct STU{
string name;
int sco;
}stu[1000];
bool cmp(STU a,STU b){
return a.sco >= b.sco;
}
int main(){
cin >> n;
for(int i = 1;i <= n; i++)
cin >> stu[i].name >> stu[i].sco;;
sort(stu + 1,stu + 1 + n,cmp);
for(int i = 1;i <= n; i++){
cout << stu[i].name << ' ' << stu[i].sco << endl;
}
return 0;
}
多关键字排序。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k;
struct STU{
int num;
int sco;
int chi,mat,eng;
}stu[1000];
bool cmp(STU a,STU b){
if(a.sco != b.sco) return a.sco > b.sco;
if(a.chi != b.chi) return a.chi > b.chi;
return a.num < b.num;
}
int main(){
cin >> n;
for(int i = 1;i <= n; i++){
stu[i].num = i;
cin >> stu[i].chi >> stu[i].mat >> stu[i].eng;
stu[i].sco = stu[i].chi + stu[i].mat + stu[i].eng;
}
sort(stu + 1,stu + 1 + n,cmp);
for(int i = 1;i <= 5; i++){
cout << stu[i].num << ' ' << stu[i].sco << endl;
}
return 0;
}
原文:https://www.cnblogs.com/Cao-Yucong/p/12184497.html