KTFinn 2023-04-19 20:14 采纳率: 45.5%
浏览 9
已结题

关于#平面#的问题,如何解决?

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;
}

帮帮我

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-04-19 22:10
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月29日
  • 已采纳回答 4月21日
  • 创建了问题 4月19日

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题