这个提没什么好说的,我直接用了双循环做了,可是有O(m+n)的做法,所以标注一下这个方法,也不难想,值得学习,想法就是用a的一个值与b对比,如果大于就说明a后面的所有的都比b大,这样就实现了m+n的复杂度。
Problem Description
已知f[]与g[]两个整数数组,元素都已经从小到大排好序,请写一个程序,算出f[]中比g[]中元素大的对数。换句话说,f[0]比g[]中多少个元素大,f[1]比g[]中多少个元素大等,这些值的总和就是要求的答案。
举个例子,如果f[]中有1,3,5,7,9,而g[]中有2,3,4,7,8。
那么:
f[0]比g[]中的所有元素都小;
f[1]比g[0]大;
f[2]比g[0]、g[1]、g[2]大;
f[3]比g[0]、g[1]、g[2]大;
f[4]比g[0]、g[1]、g[2]、g[3]、g[4]大;
所以答案是0+1+3+3+5=12。
Input
第一行为两个整数m, n(1≤m, n≤1000),分别代表数组f[], g[]的长度。
第二行有m个元素,为数组f[]。
第三行有n个元素,为数组g[]。
Output
输出支配值。
Example Input
5 5
1 3 5 7 9
2 3 4 7 8
Example Output
12
#include<iostream>
#include<string>
#include<algorithm>
#include<string.h>
using namespace std;
int a[1024];
int b[1024];
int sum = 0;
void count(int *a, int *b, int m, int n) {
int i, j; i = j = 0;
while (i < m&&j < n) {
if (a[i] <= b[j])
i++;
else {
j++;
sum += m - i;
}
}
}
int main(void) {
int m, n,t = 0;
cin >> m >> n;
for (int i = 0; i < m; i++)
cin >> a[i];
for (int j = 0; j < n; j++)
cin >> b[j];
/*for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (a[i] > b[j]) {
sum++;
}
else break;
}
}*/
count(a, b, m, n);
cout << sum;
system("pause");
return 0;
}