Dilk4. 大V
时间限制:1.0s 内存限制:256.0MB 代码提交间隔:3分钟(现在可以提交)
问题描述
当夜深人静时,小明喜欢独自凝望着天空。
这一天,小明看着满天的繁星,突发奇思妙想,他发现可以通过用直线连接天空中的星星来组成美丽的图案。
小明想到一个非常简单的图案:大写的V,如果连接三颗星星,中间一颗最靠下方,这样的形状就是一个大V了。
小明越想越着迷,他想知道,天空中最亮的 n 颗星星,可以有多少种方式组成大V。
为了更严谨的看待问题,小明把自己所见范围的天空映射到了一个平面直角坐标系中,他看到的最亮的 n 颗星星在这个坐标系中都有自己的坐标。
如果三颗星星的坐标分别为 (x_i, y_i), (x_j, y_j), (x_k, y_k),当 x_i < x_j < x_k 且 y_j < y_i 且 y_j < y_k 时,这三颗星星就组成了一个大 V。
输入格式
输入的第一行包含一个整数 n 。
接下来 n 行,每行两个整数,每一行表示一颗星星的 x 坐标和 y 坐标。
输出格式
输出一行包含一个整数,表示有多少种方式组成大V。
样例输入
5
4 5
2 3
1 4
3 3
5 8
样例输出
4
评测用例规模与约定
对于 30% 的评测用例,2 <= n <= 50,星星的坐标为不超过 1000 的非负整数。
对于 50% 的评测用例,2 <= n <= 100,星星的坐标为不超过 1000 的非负整数。
对于 80% 的评测用例,2 <= n <= 1000,星星的坐标为不超过 10000 的非负整数。
对于所有评测用例,2 <= n <= 5000,星星的坐标为不超过 100000 的非负整数。
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int abc[n][2];
int sum = 0;
for (int i=0; i<n; i++) {
cin >> abc[i][0] >> abc[i][1];
}
for (int i=0; i<n; i++) {
for (int j=i+1; j<n; j++) {
for (int k=j+1; k<n; k++) {
//看三个点是否满足当题中( x_i < x_j < x_k 且 y_j < y_i 且 y_j < y_k)
//三个点的排列一共有6种情况,直接进行判断,是否符合这6种情况的其中一种
if ((abc[i][0]<abc[j][0]&&abc[j][0]<abc[k][0]) && (abc[j][1]<abc[i][1]) && (abc[j][1]<abc[k][1])) {
sum = sum + 1;
}
else if ((abc[k][0]<abc[j][0]&&abc[j][0]<abc[i][0]) && (abc[j][1]<abc[i][1]) && (abc[j][1]<abc[k][1])) {
sum = sum + 1;
}
else if ((abc[k][0]<abc[i][0]&&abc[i][0]<abc[j][0]) && (abc[i][1]<abc[k][1]) && (abc[i][1]<abc[j][1])) {
sum = sum + 1;
}
else if ((abc[j][0]<abc[i][0]&&abc[i][0]<abc[k][0]) && (abc[i][1]<abc[k][1]) && (abc[i][1]<abc[j][1])) {
sum = sum + 1;
}
else if ((abc[i][0]<abc[k][0]&&abc[k][0]<abc[j][0]) && (abc[k][1]<abc[i][1]) && (abc[k][1]<abc[j][1])) {
sum = sum + 1;
}
else if ((abc[j][0]<abc[k][0]&&abc[k][0]<abc[i][0]) && (abc[k][1]<abc[i][1]) && (abc[k][1]<abc[j][1])) {
sum = sum + 1;
}
}
}
}
cout << sum << endl;
return 0;
}
帮帮我