《算法竞赛·快冲300题》每日一题:“房间划分”

算法竞赛·快冲300题》将于2024年出版,是《算法竞赛》的辅助练习册。
所有题目放在自建的OJ New Online Judge。
用C/C++、Java、Python三种语言给出代码,以中低档题为主,适合入门、进阶。

文章目录

  • 题目描述
  • 题解
  • C++代码
  • Java代码
  • Python代码

房间划分” ,链接: http://oj.ecustacm.cn/problem.php?id=1830

题目描述

【题目描述】 给定一个凸多边形房间,现在需要将房间划分成等面积的两部分。
   房间只有一个门,可以视为一个顶点,需要沿着直线将房间划分成两部分。
   直线的一端必须是门,另一端必须是墙角或者墙壁。
   如下图所示,最终需要求解出直线另一端点的坐标。
在这里插入图片描述

【输入格式】 第一行为正整数n,表示凸多边形的顶点数量,3≤n≤200000。
   接下来n行。每行两个整数x和y表示顶点坐标, − 1 0 7 ≤ x , y ≤ 1 0 7 -10^7≤x,y≤10^7 107x,y107
   输入保证顶点是按照逆时针的顺序进行输入,没有重复的两个点,且第一个点视为门。
【输出格式】 输出另一端点的坐标x和y,以一个空格分隔。
   输出的每个数字的绝对误差小于 1 0 − 6 10^{-6} 106均视为正确。
【输入样例】

5
7 1
8 3
5 5
2 3
3 1

【输出样例】

3.5 4

题解

   求面积是叉积的经典应用。
   以门为起点,与其他所有顶点连线,把多边形分成多个三角形。对每个三角形求面积,所有三角形面积之和是多边形的面积。然后找到平分总面积的直线所在的那个三角形,直线的终点在这个三角形边上。。
【重点】 叉积,几何模板的掌握。

C++代码

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
struct Point{
    double x, y;
    Point(){}
    Point(double x, double y):x(x), y(y){}
    Point operator + (Point b) { return Point(x+b.x,y+b.y); }
    Point operator - (Point b) { return Point(x-b.x,y-b.y); }
    Point operator * (double k) { return Point(k*x,k*y); }
}p[N];
typedef Point Vector;
double Cross(Vector A, Vector B){return A.x*B.y - A.y*B.x;}//叉积
double Area(Point A, Point B, Point C){return 0.5 * Cross(B-A, C-A);}//三角形面积
int main(){
    int n; scanf("%d", &n);
    for(int i = 1; i <= n; i++)  scanf("%lf%lf", &p[i].x, &p[i].y);
    double s = 0;      //多边形面积
    for(int i = 2; i <= n - 1; i++)
        s += Area(p[1], p[i], p[i + 1]);
    s *= 0.5;          //总面积的一半
    double a = 0;      //重新开始累加三角形面积
    for(int i = 2; i <= n - 1; i++) {
        double b = a + Area(p[1], p[i], p[i + 1]);   //b比a多一个三角形
        if(a <= s && b >= s){                     //找到平分总面积的三角形
            double t = (s - a) / (b - a);         //比例
            Point delta = (p[i + 1] - p[i]) * t;  //两点中间等比例处是答案
            Point ans = p[i] + delta;
            printf("%.9f %.9f\n", ans.x, ans.y);
            break;
        }
        a = b;
    }
    return 0;
}

Java代码

import java.util.Scanner;
public class Main {
   static int N = 200010;
   static class Point {
       double x, y;
       Point() {}
       Point(double x, double y) { this.x = x; this.y = y; }
       Point add(Point b) { return new Point(x + b.x, y + b.y);  }
       Point subtract(Point b) { return new Point(x - b.x, y - b.y); }
       Point multiply(double k) {return new Point(k * x, k * y); }
   }
   static double cross(Point A, Point B) {return A.x * B.y - A.y * B.x;}
   static double area(Point A, Point B, Point C) {return 0.5 * cross(B.subtract(A), C.subtract(A));}
   public static void main(String[] args) {
       Scanner scan = new Scanner(System.in);
       int n = scan.nextInt();
       Point[] p = new Point[N];
       for (int i = 1; i <= n; i++) 
           p[i] = new Point(scan.nextDouble(), scan.nextDouble());
       double s = 0;
       for (int i = 2; i <= n - 1; i++) 
           s += area(p[1], p[i], p[i + 1]);
       s *= 0.5;
       double a = 0;
       for (int i = 2; i <= n - 1; i++) {
           double b = a + area(p[1], p[i], p[i + 1]);
           if (a <= s && b >= s) {
               double t = (s - a) / (b - a);
               Point delta = p[i + 1].subtract(p[i]).multiply(t);
               Point ans = p[i].add(delta);
               System.out.printf("%.9f %.9f\n", ans.x, ans.y);
               break;
           }
           a = b;
       }
       scan.close();
   }
}

Python代码

N = 200010
class Point:
    def __init__(self, x=0, y=0): self.x = x;  self.y = y
    def __add__(self, B): return Point(self.x + B.x, self.y + B.y)
    def __sub__(self, B): return Point(self.x - B.x, self.y - B.y)
    def __mul__(self, k): return Point(self.x * k, self.y * k)
def cross(A, B):   return A.x * B.y - A.y * B.x
def area(A, B, C): return 0.5 * cross(B - A, C - A)
n = int(input())
p = [None] * (N)
for i in range(1, n + 1):
    x, y = map(float, input().split())
    p[i] = Point(x, y)
s = 0
for i in range(2, n): s += area(p[1], p[i], p[i + 1])
s *= 0.5
a = 0
for i in range(2, n):
    b = a + area(p[1], p[i], p[i + 1])
    if a <= s and b >= s:
        t = (s - a) / (b - a)
        delta = (p[i + 1] - p[i]) * t
        ans = p[i] + delta
        print("%.9f %.9f" % (ans.x, ans.y))
        break
    a = b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/73208.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全文检索与日志管理 Elasticsearch(上)

一、Elasticsearch介绍 1.1 全文检索索引 Elasticsearch是一个全文检索服务器&#xff0c;全文检索是一种非结构化数据的搜索方式。 那么什么是结构化数据和非结构化数据呢&#xff1f; 结构化数据&#xff1a;指具有固定格式固定长度的数据&#xff0c;如数据库中的字段。 …

影响股票数据接口l2传输数据快慢因素有哪些?(l2数据接口)

股票数据接口l2是一种用于获取股票市场相关数据的编程接口。它允许开发者通过编程的方式获取、查询、订阅和更新股票相关数据&#xff0c;如股票价格、成交量、财务数据等&#xff0c;并将这些数据用于自己的应用或系统中。l2数据接口通常提供实时行情数据、历史行情数据、财务…

【深度学习】多粒度、多尺度、多源融合和多模态融合的区别

多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09; 多粒度&#xff08;multiresolution&#xff09;和多尺度&#xff08;multiscale&#xff09;都是指在不同的空间或时间尺度上对数据或信号进行分析和处理。其中 多尺度&#xff1…

为什么要学PMP项目管理?

为什么要学习PMP呢&#xff0c;主要有以下五点&#xff1a; 01提升个人能力 PMP是一个系统学习的过程&#xff0c;充分理解各个项目管理的过程以及项目管理的各个过程组、知识领域等&#xff0c;可以从理论上掌握项目经理应具有的理论素质。能够知道如何对执行的项目进行系统…

django实现登录和登录的鉴权

1、创建数据库的管理员表 在models.py 中定义admin表&#xff0c;为了简单&#xff0c;表里只有用户名和密码还有默认加的id 三个字段 from django.db import models# Create your models here.class Admin(models.Model):username models.CharField(verbose_name"用户…

leetcode剑指 Offer 05. 替换空格(两种方法)

题目&#xff1a;leetcode剑指 Offer 05. 替换空格 描述&#xff1a; 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。 示例 1&#xff1a; 输入&#xff1a;s “We are happy.” 输出&#xff1a;“We%20are%20happy.” 思路&#xff1a; 第一…

【vue】alert弹窗太死板?试试这种方法(附代码)

alert(response.data.message); 新方法&#xff1a; this.$message.error(请检查您输入的的用户名和密码&#xff01;);

用户端Web自动化测试-L1

目录&#xff1a; Web自动化测试价值与体系环境安装与使用自动化用例录制自动化测试用例结构分析web浏览器控制常见控件定位方法强制等待与隐式等待常见控件交互方法自动化测试定位策略搜索功能自动化测试用户端Web自动化测试 1.Web自动化测试价值与体系 功能测试场景: UI 自…

【机密计算实践】OPEN Enclave SDK 安装与构建

机密计算是基于硬件支持的可信执行环境的&#xff0c;比如 Intel SGX 硬件技术上面的 enclave 以及 Arm Trustzone 上的 OT-TEE&#xff0c;不过这些异构的 TEE 之间差异还是蛮大的&#xff0c;所以亟需一种能够屏蔽 TEE 差异软件中间件或者 SDK&#xff0c;这就是本文将要提到…

使用BP插件captcha-killer识别图片验证码绕过系统验证码机制

使用BP插件captcha-killer绕过验证码 前置条件 1、下载安装插件 burp2020前使用&#xff1a;https://github.com/c0ny1/captcha-killer/tree/0.1.2 burp2020后使用&#xff1a;https://github.com/Ta0ing/captcha-killer-java8 2、导入插件 分为三个部分&#xff1a;上面为验…

spring之AOP简单介绍

1.AOP的概念 AOP&#xff0c;Aspect Oriented Programming&#xff0c;面向切面编程&#xff0c;是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象&#xff0c;一个对象包括静态的属性信息&#xff0c;包括动态的方法信息等。而AOP是横向的对不同事物的抽象&#xff0c;…

深度学习部署:FastDeploy部署教程(CSharp版本)

FastDeploy部署教程(CSharp版本) 1. FastDeploy介绍 FastDeploy是一款全场景、易用灵活、极致高效的AI推理部署工具&#xff0c; 支持云边端部署。提供超过 &#x1f525;160 Text&#xff0c;Vision&#xff0c; Speech和跨模态模型&#x1f4e6;开箱即用的部署体验&#xf…

FreeRTOS(软件定时器)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、软件定时器的概念 1、软件定时器的概念 2、软件定时器支持功能 3、单次模式与周期模式 4、定时器守护任务 二、软件定时器的应用 1、应用场景 2、软件定时器的精度 3、回调…

OptaPlanner笔记6 N皇后

N 个皇后 问题描述 将n个皇后放在n大小的棋盘上&#xff0c;没有两个皇后可以互相攻击。 最常见的 n 个皇后谜题是八个皇后谜题&#xff0c;n 8&#xff1a; 约束&#xff1a; 使用 n 列和 n 行的棋盘。在棋盘上放置n个皇后。没有两个女王可以互相攻击。女王可以攻击同一水…

YOLO v8目标跟踪详细解读(二)

上一篇&#xff0c;结合代码&#xff0c;我们详细的介绍了YOLOV8目标跟踪的Pipeline。大家应该对跟踪的流程有了大致的了解&#xff0c;下面我们将对跟踪中出现的卡尔曼滤波进行解读。 1.卡尔曼滤波器介绍 卡尔曼滤波&#xff08;kalman Filtering&#xff09;是一种利用线性…

Java多款线程池,总有一款适合你。

线程池的选择 一&#xff1a;故事背景二&#xff1a;线程池原理2.1 ThreadPoolExecutor的构造方法的七个参数2.1.1 必须参数2.1.2 可选参数 2.2 ThreadPoolExecutor的策略2.3 线程池主要任务处理流程2.4 ThreadPoolExecutor 如何做到线程复用 三&#xff1a;四种常见线程池3.1 …

Jenkins+Docker+SpringCloud微服务持续集成项目优化和微服务集群

JenkinsDockerSpringCloud微服务持续集成项目优化和微服务集群 JenkinsDockerSpringCloud部署方案优化JenkinsDockerSpringCloud集群部署流程说明修改所有微服务配置 设计Jenkins集群项目的构建参数编写多选项遍历脚本多项目提交进行代码审查多个项目打包及构建上传镜像把Eurek…

Vue 引入 Element-UI 组件库

Element-UI 官网地址&#xff1a;https://element.eleme.cn/#/zh-CN 完整引入&#xff1a;会将全部组件打包到项目中&#xff0c;导致项目过大&#xff0c;首次加载时间过长。 下载 Element-UI 一、打开项目&#xff0c;安装 Element-UI 组件库。 使用命令&#xff1a; npm …

时序预测 | MATLAB实现基于LSTM长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)

时序预测 | MATLAB实现基于LSTM长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价) 目录 时序预测 | MATLAB实现基于LSTM长短期记忆神经网络的时间序列预测-递归预测未来(多指标评价)预测结果基本介绍程序设计参考资料 预测结果 基本介绍 Matlab实现LSTM长短期记忆神经…

[保研/考研机试] KY87 鸡兔同笼 北京大学复试上机题 C++实现

描述 一个笼子里面关了鸡和兔子&#xff08;鸡有2只脚&#xff0c;兔子有4只脚&#xff0c;没有例外&#xff09;。已经知道了笼子里面脚的总数a&#xff0c;问笼子里面至少有多少只动物&#xff0c;至多有多少只动物。 输入描述&#xff1a; 每组测试数据占1行&#xff0c;…