算法基础训练(二)

来源:互联网 发布:黑暗之魂3捏御姐数据 编辑:程序博客网 时间:2024/06/07 07:32
C时间限制:1 毫秒 |  C内存限制:1 Kb
题目内容:
设A[1..n]是一个包含N个非负整数的数组。如果在i〈 j的情况下,有A[i]〉A[j],则(i,j)就称为A中的一个逆序对。要解决的问题是,给出一个数列,求出这个数列包含多少个逆序对
输入描述
有多组测试数据,每组数据占一行。首先输入一个整数N表示数组元素有N个,接下来输入N个整数N<=50 (无奈痛苦默默改小了数据...)(再次痛苦默默无奈再改小数据...)

输出描述
输出一个整数。

输入样例
5 3 1 4 5 2

输出样例
4hint:(样例解释,不需要输出)数组(3,1,4,5,2)的“逆序对”有<3,1>,<3,2><4,2><5,2>,共4个。

程序代码//此题很简单,主要是弄清楚有逆序对是什么,就是在一组数据中找到有几对逆序,既然这样,我们可以直接使用暴力,如,一组数据中有五个数,3,1,4,5,2,我们可以用暴力,先从3开始,找后面的数有多少个数比3小就有几对,3的逆序对找完了就找比1小的,再找比4小的,按此规律找下去,算法的世界复杂度是O(n^2),耗时长,但是思想简单,下一篇中有更优的方法。
#include<iostream>
using namespace std;
int check(int b[],int m,int n){
int count=0;
for(int j=m;j<n;j++){
if(b[m]>b[j]){
count++;
}
}
return count;
}
int main(){
int N;
while(cin>>N){
int a[60];
int s=0;
for(int i=0;i<N;i++){
cin>>a[i];
}
for(int i=0;i<N;i++){
s=s+check(a,i,N);
//cout<<check(a,i,N)<<s<<endl;
}
cout<<s<<endl;
}

return 0;
}
0 0
原创粉丝点击