今天是重刷一本通的第二天
今天刷的是第二章的数据排序
这次呢
题有点多
直接放上前两个题的代码罢
T1车厢重组
/*T1车厢重组 这个小水题我们直接用冒泡排序过了罢*/ #include<iostream> using namespace std; int main(){ int n,a[n+1]={0},ans; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } for(int i=1;i<=n;i++){ for(int j=1;j<=i;j++){ if(a[i]<a[j]){ int t=a[i]; a[i]=a[j]; a[j]=t; ans++; } } } cout<<ans; return 0; }
T2求逆序对
/*T2求逆序对 归并排序直接上*/ #include<cstdio> int n,a[100001],c[100001]; unsigned long long ans=0; void m(int l,int r){ int mid=(l+r)/2,i,j,tmp; if(l>=r) return; m(l,mid); m(mid+1,r); tmp=l; for(i=l,j=mid+1;i<=mid&&j<=r;) if(a[i]>a[j]) c[tmp++]=a[j++],ans+=mid-i+1; else c[tmp++]=a[i++]; if(i<=mid) for(;i<=mid;) c[tmp++]=a[i++]; if(j<=r) for(;j<=r;) c[tmp++]=a[j++]; for(i=l;i<=r;i++) a[i]=c[i]; } int main(void){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i); m(1,n); printf("lld",ans); return 0; }