目录
题目链接:
思路:
代码:
总结常见的排序写法:
题目链接:
0肖恩的排序 - 蓝桥云课 (lanqiao.cn)
思路:
参考罗老师的思路:<蓝桥杯软件赛>零基础备赛20周--第8周第2讲--排序的应用-CSDN博客
下图出自罗老师的博客:
其实就是排列组合问题
固定好b数组的顺序,看a数组有多少种顺序
a从大到小是8 6 5 3 2 ,b从大到小是5 4 3 2 1。固定b看a的话,b是5的时候,同样位置比b大的 的a只能是8 或者6 ,两种可能。 b是4的话,同样位置比b大的是8 6 5 ,但是第一个位置用了一个,只剩3-1=2个,所以是2种,同理后面的都是1种,2*2*1*1*1=4
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10,MOD=1e9+7;
int a[N],b[N];int main(){long long n; //必须是long longcin>>n;for(int i=0;i<n;i++){cin>>a[i];}for(int i=0;i<n;i++){cin>>b[i];}sort(a,a+n,greater<int>()); //A数组从大到小排序sort(b,b+n,greater<int>()); //B数组从大到小排序long long cnt=0,ans=1;for(int i=0,j=0;i<n;i++){ //枚举每个b[i]while(j<n && a[j]>b[i]) { //找所有大于b[i]的数cnt++;j++;}ans*=cnt;cnt--;ans%=MOD;}cout<<ans<<endl;return 0;
}
先对a,b数组从大到小排序。之后,固定b数组为b[i],找a数组里哪些数是大于b[i]的,因此while循环里要有一个a[j]>b[i]的条件判断,如果满足这个条件,就接着往后找,看下一个数是不是也大于b[i]。直到不满足这个条件的时候,说明找到了当前a数组里所有大于 b[i] 的数了,这些数字都可以填到第 i 位。 所以第 i 位是cnt 种选择,但是因为这个位置固定了,所以后面的位置可以放的个数是减少的。因此在ans*cnt之后,cnt要--。 因为a,b数组都是从大到小排序的,所以i++之后,之前那些大于b[i]的a数组的值,肯定大于现在的这些b[i]的,所以 j 不需要从0开始重新遍历,只需要在上次遍历的基础上进行遍历即可。
总结常见的排序写法:
数组a[n],它的数是保存在 [0,n) 中的,那么它的排序:
1.从小到大: sort(a,a+n); //a是数组的首
2.从大到小:sort(a,a+n,greater<int>()); //A数组从大到小排序
3.自定义大于小于:
bool my_less(int i, int j) {return (i < j);} //自定义小于
bool my_greater(int i, int j) {return (i > j);} //自定义大于sort(a,a+n,my_less);
sort(a,a+8,my_greater);