今天做了7622求排列逆序,半个小时,得到了一个时间超时的结果,但是我不太知道怎么改进了。
代码如下:
#include <iostream> #include <algorithm> using namespace std; int num[100002]; int status[100002]; long long result = 0; int n; int cal2(int number){ int x=0; for(int i=number;i<n;i++){ if(status[i]==1) x++; } return x; } void cal(int number){ int i=0; for(;i<n;i++){ if(status[i]==0){ if(number == num[i]){ status[i]=1; } if(number > num[i]){ break; } } } result+=(n-i-cal2(i)); } bool cmp(int a,int b){ return a>b; } int main() { int x[100002]; cin>>n; for(int i=0;i<n;i++){ cin>>num[i]; x[i]=num[i]; status[i]=0; } sort(num,num+n,cmp); for(int i=0;i<n;i++){ cal(x[i]); } cout<<result<<endl; return 0; }
思路是把数组排序好,然后每个对应了标记,用过的就把标记设为1,这样再计算。
后来发现,确实要循环很多次,有点耗时间。
然后看看提干,发现有提示说用归并排序,然后我就去查归并排序了。
后来发现是利用递归,然后把左边排好,右边排号,再合并起来。
但是我还是不太熟悉,大概是弄懂原理了,还是错了0-0。
觉得自己周末得花半天来专门练习算法,然后解决这些遗留问题,
然后每天的算法题如果没做出来,就至少也得写一篇这样的小结文章,反思,嗯啊加油。
时间: 2024-10-11 12:34:09