[ICPC 2022 Nanjing R] 清空水箱题解
题目描述
自来水厂最近建造了一种多边形水箱,水箱的厚度可以忽略不计。
为了启用水箱,工程师们准备在水箱上安装若干出水阀门。一个出水阀门可以被看作水箱上的一个点,当阀门打开时,水箱里的水会从阀门流出。

如上图所示,紫色的点代表阀门,而浅蓝色区域代表阀门全部打开后水箱内剩余的水。
作为总工程师的您需要知道,至少需要安装多少个出水阀门,才能在所有阀门同时打开后,让水箱里的水全部流出。
您可以认为水是一种理想流体且环境中不存在大气压,因此水总有流向更低处的趋势,即使位于水平平面上也是如此。
输入格式
每个测试文件仅有一组测试数据。
第一行输入一个整数 n(3≤n≤2×103)表示多边形(也就是水箱的形状)的顶点数。
对于接下来 n 行,第 i 行输入两个整数 xi 和 yi(∣xi∣,∣yi∣≤104)表示多边形第 i 个顶点的坐标。顶点按逆时针顺序给出。
给定的多边形是简单多边形。也就是说,多边形的顶点两两不同,且除了相邻边存在公共顶点外,不存在两条边有公共点。不保证相邻边不共线。
输出格式
输出一行一个整数表示清空水箱至少需要多少个出水阀门。
输入输出样例
输入 #1复制
6 0 0 1 1 2 1 3 0 3 2 0 2
输出 #1复制
2
输入 #2复制
8 4 4 0 4 0 2 1 2 2 2 2 0 3 0 4 0
输出 #2复制
1
输入 #3复制
7 1 0 3 4 0 3 1 2 2 3 1 1 0 2
输出 #3复制
2
说明/提示
对于第一组样例数据,在 (0,0) 与 (3,0) 安装两个出水阀门即可清空水箱。
对于第二组样例数据,在 (3,0) 安装一个出水阀门即可清空水箱。事实上,只要把该出水阀门安装在满足 2≤x≤4 的 (x,0) 即可。
对于第三组样例数据,在 (1,0) 与 (1,2) 安装两个出水阀门即可清空水箱。

思路
向量判断。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,x[10004],y[10004],q[10004],p[10004],o=1,lk=0;
int qian(int i){
if(i==1){
return n;
}
else{
return i-1;
}
}
int hou(int i){
if(i==n){
return 1;
}
else{
return i+1;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i]>>y[i];
}
for(int i=1;i<=n;i++){
q[i]=x[i]-x[qian(i)];
p[i]=y[i]-y[qian(i)];
}
for(int i=1;i<=n;i++){
while(y[i]==y[o]){
o=hou(o);
}
//cout<<o<<endl;
if(o==hou(i)){
if(p[i]<0&&p[o]>0&&(q[i]*p[o]-p[i]*q[o])>0){
lk++;
}
}
else{
if(x[qian(o)]>x[i]&&p[i]<0&&p[o]>0){
lk++;
}
}
}
cout<<lk<<endl;
return 0;
}

浙公网安备 33010602011771号