Time Limit: 7000MS | Memory Limit: 65536K | |
Total Submissions: 40008 | Accepted: 14432 |
Description
Input
Output
Sample Input
5 9 1 0 5 4 3 1 2 3 0
Sample Output
6 0
搜索思想 超时
#include <iostream>//由小到大排序 using namespace std; int s[500005]; int main() { int i, j; int n; while(cin>>n&&n) { for(i=1;i<=n;i++) cin>>s[i]; int sum=0; int temp; for(i=1;i<n;i++) for(j=1;j<n;j++) if(s[j]>s[j+1]) { sum=sum+1; temp=s[j]; s[j]=s[j+1]; s[j+1]=temp; } cout<<sum<<endl; } return 0; }
分冶思想——归并排序
#include <iostream> using namespace std; const int n=500000; int a[n],b[n]; unsigned __int64 sum; void merge(int p,int q,int r) { int begin_a=p,begin_b=q+1,t=p; for(;begin_a<=r;begin_a++) b[begin_a]=a[begin_a]; begin_a=p; while((begin_a<=q) && (begin_b<=r)) { if(b[begin_a]<=b[begin_b]) { a[t++]=b[begin_a++]; } else { a[t++]=b[begin_b++]; sum+=q-begin_a+1; } } while(begin_a<=q) a[t++]=b[begin_a++]; while(begin_b<=r) a[t++]=b[begin_b++]; } void mergeSort(int low,int high) { if(low<high) { int mid=(low+high)/2; mergeSort(low,mid); mergeSort(mid+1,high); merge(low,mid,high); } } int main() { int i,m; while(scanf("%d",&m) && m!=0) { for(i=0;i<m;i++) scanf("%d",&a[i]); sum=0; mergeSort(0,m-1); printf("%I64d\n",sum); } return 0; }