2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 C: 剪切 - 题解
傳送門
- 分割
- 題目描述
- 輸入描述
- 輸出描述
- 樣例一
- 輸入
- 輸出
- 樣例二
- 輸入
- 輸出
- 提示
- 題目分析
- AC代碼
分割
- CMP
- 跳蛙
- 剪切
- 數學?
- 數學!
- 逃離
時間限制:1秒
空間限制:128M
題目描述
在一個二維坐標平面上,有一個四邊形。
它的四個頂點的坐標分別是 (0,0),(W,0),(W,H)(0,0),(W,0),(W,H)(0,0),(W,0),(W,H)和(0,H)(0,H)(0,H)
四邊形內部(或邊界上),有一個點。
它的坐標是(x,y)(x,y)(x,y)。
從這個點畫一條直線,把四邊形分成兩個部分。
問你面積最小的那個部分的最大面積是多少。
同時,還要問你得到這個面積的劃分方法數。
輸入描述
輸入一行444個空格隔開的正整數,具體意義見題目描述。
輸入格式如下:
W H x y其中:
- 1≤W,H≤1091\leq W,H\leq10^91≤W,H≤109
- 0≤x≤W0\leq x\leq W0≤x≤W
- 0≤y≤H0\leq y\leq H0≤y≤H
輸出描述
輸出一行空格隔開的兩個數
- 第一個數是劃分成的兩部分的面積最小的那部分的最大面積,7舍8入保留6位小數。
- 第二個數代表劃分成這個面積的方案,0代表只有一種劃分方案,1代表有多種劃分方案。
樣例一
輸入
2 3 1 2輸出
3.000000 0樣例二
輸入
2 2 1 1輸出
2.000000 1提示
樣例一中,直線x=1x=1x=1將四邊形劃分為面積相等的兩塊兒,每一塊兒的面積都是3,且只有這一種劃分方案
題目描述能力有限,不喜勿噴
題目分析
不難發現這個四邊形是一個矩形。矩形內一點做一條直線總有方法把矩形劃分為面積相等的兩部分。
因此面積小的那部分的最大值就是矩形面積的一半(W?H/2W* H/2W?H/2)。
什么4舍5入7舍8入都是套路,因為面積的一半要么是整數,要么是“.5.5.5”,保留666位小數的話最后一位小數肯定是000,因此不需要擔心進位問題。
那么還有問題就是有多少種方法可以把矩形分成面積相等的兩部分。
一條直線把矩形分成面積相等的兩部分,此線必過矩形中心。
那么問題迎刃而解:
-
如果給你的點不是矩形中心,需且只需要做一條經過這個點和矩形中心點的連線就能把矩形劃分為面積相等的兩部分。
只有這一種做法,故第二個數輸出0。 -
如果給你的點恰好是矩形中心,那么經過這個點的任意一條直線都經過矩形中心,都能把矩形劃分為面積相等的兩部分。
做法有無數種,故第二個數輸出1。
AC代碼
#include <iostream> using namespace std;int main() {double a, b, c, d;cin >> a >> b >> c >> d;printf("%.6lf ", a * b / 2);puts(abs(a - c * 2) < 1e-7 && abs (b - d * 2) < 1e-7 ? "1" : "0"); // 其中abs(x)<1e-7可以理解為|x|=0,因為浮點數有精度問題return 0; }原創不易,轉載請附上原文鏈接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/120897332
總結
以上是生活随笔為你收集整理的2021-2022-1 ACM集训队每周程序设计竞赛(5) - 问题 C: 剪切 - 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML+JS 实现 input 框回车
- 下一篇: 实验一:交换机和路由器的基本配置