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

posted @ 2025-10-10 16:36  bz02_2023f2  阅读(3)  评论(0)    收藏  举报  来源