解题思路: 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语言训练-8除不尽的数 (C语言代码)暴力解法,答案只有一个,直接输出就好了浏览:1049 |
C语言训练-委派任务* (C语言代码)..................竟然是第一个浏览:2216 |
打水问题 (C语言代码)浏览:1156 |
大神老白 (C语言代码)浏览:696 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:725 |
WU-输出九九乘法表 (C++代码)浏览:1855 |
DNA (C语言描述,蓝桥杯)浏览:1654 |
愚蠢的摄影师 (C++代码)浏览:981 |
1124题解浏览:632 |
C语言程序设计教程(第三版)课后习题12.6 (C语言代码)浏览:733 |