2 条题解
-
0
去年(2022.9.18)初赛的代码,记忆犹新
归并排序求逆序对
#include<cstdio> using namespace std; int n; int r[10010];//临时储存数组 int a[10010]; long long int ans; void msort(int s,int t);//归并排序求逆序对 int main() { scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); } msort(1,n); printf("%lld",ans); return 0; } void msort(int s,int t)//归并排序求逆序对 { if (s==t)//递归终止条件 return; int mid=(s+t)/2,i=s,j=mid+1; msort(s,mid);//左序列排序 msort(mid+1,t);//右序列排序 //合并左右序列 int k=s; while (i<=mid&&j<=t) { if (a[i]>a[j])//前面的比后面的要更大 { ans+=mid-i+1;//都需要交换 r[k]=a[j]; j++; k++; } else //不用交换 {//a[i]<=a[j] r[k]=a[i]; k++; i++; } } while (i<=mid)//剩下的进入数组 { r[k]=a[i]; i++; k++; } while (j<=t)//剩下的进入数组 { r[k]=a[j]; j++; k++; } for (int p=s;p<=t;p++)//放回原数组 { a[p]=r[p]; } }
-
0
//冒泡排序 ,不解释 #include<iostream> using namespace std; int a[10000]; int main() { int n,m=0; bool flag; cin>>n; for(int i=1;i<=n;++i) cin>>a[i]; for(int i=1;i<=n-1;i++) //n个数排n-1趟 { flag=true; for(int j=1;j<=n-i;j++)//每趟排序的比较次数 if(a[j]>a[j+1]) //从小到大排序,前一数小于后一个数 { int temp=a[j]; //两个数交换 a[j]=a[j+1]; a[j+1]=temp; m++; flag=false; } if(flag) break; } cout<<m<<endl; return 0; }
- 1
信息
- ID
- 436
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 46
- 已通过
- 21
- 上传者