解题思路: 1.先排序,再枚举每种情况就行
2.对于双指针,因为题目是要Ai < Bj < Ck, 所以只要找到A小于B的个数和C大于B的个数,用乘法原理得出答案。
参考代码:
(暴力)
#include
using namespace std;
const int N = 100010;
int a[N], b[N], c[N];
typedef long long ll;
int main(void) {
ll ans = 0;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 0; i < n; i++) scanf("%d", &b[i]);
for (int i = 0; i < n; i++) scanf("%d", &c[i]);
sort(a, a + n);
sort(b, b + n);
sort(c, c + n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (b[j] > a[i]) {
for (int k = 0; k < n; k++) {
if (c[k] > b[j]) {
ans += (n - k);
break;
}
}
}
}
}
printf("%lld\n", ans);
return 0;
}
(双指针)
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N], b[N], c[N];
typedef long long ll;
int main(void) {
ll ans = 0;
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
for (int i = 0; i < n; i++) scanf("%d", &b[i]);
for (int i = 0; i < n; i++) scanf("%d", &c[i]);
sort(a, a + n);
sort(b, b + n);
sort(c, c + n);
for (int i = 0, j = 0, k = 0; i < n; i++) {
while (j < n && a[j] < b[i]) j++;
while (k < n && c[k] <= b[i]) k++;
ans += (ll)j * (n - k);
}
printf("%lld\n", ans);
return 0;
}
0.0分
1 人评分
C语言训练-斐波纳契数列 (C语言代码)浏览:774 |
C语言训练-求素数问题 (C语言代码)浏览:952 |
C语言程序设计教程(第三版)课后习题9.10 (C语言代码)浏览:600 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:734 |
2006年春浙江省计算机等级考试二级C 编程题(2) (C语言代码)浏览:467 |
大神老白 (C语言代码)浏览:638 |
最小公倍数 (C语言代码)浏览:1025 |
矩阵加法 (C语言代码)浏览:1719 |
1024题解浏览:806 |
大家好,我是验题君浏览:575 |