P14433 [JOISC 2013] JOI 海报 / JOI Poster
题目描述
K 理事长正在设计三张为国际信息学奥林匹克日本代表队助威的海报。每张海报计划分别融入一个字母 J、O、I。在迅速完成了字母 J 和字母 I 的海报后,K 理事长打算以澳大利亚的星空为背景来设计剩下的字母 O 海报。
海报是一个宽度为 WWW、高度为 HHH 的矩形,左下角坐标为 (0,0)(0, 0)(0,0),右上角坐标为 (W,H)(W, H)(W,H)。海报上印有 NNN 颗星星。第 iii 颗星 SiS_iSi(1≤i≤N1 \leq i \leq N1≤i≤N)在海报上的坐标为 (Xi,Yi)(X_i, Y_i)(Xi,Yi),且任意两颗星不在同一坐标。
K 理事长在构思字母 O 的设计时,产生了如下想法:从 NNN 颗星中选出四颗不同的星,分别记为 A,B,C,DA, B, C, DA,B,C,D。以 AAA 为圆心、BBB 为圆上一点作圆 O1O_1O1,以 CCC 为圆心、DDD 为圆上一点作圆 O2O_2O2。当两个圆 O1,O2O_1, O_2O1,O2 同时满足以下两个条件时,这四颗星 A,B,C,DA, B, C, DA,B,C,D 构成 K 理事长设计方案的候选:
- 圆 O1O_1O1 将圆 O2O_2O2 完全包含于其内部。即,圆 O2O_2O2 的内部或圆周上的任意点均位于圆 O1O_1O1 的内部(不包括圆周)。
- 两个圆均不超出海报的矩形区域。即,对于圆内或圆周上的任意点 (X,Y)(X, Y)(X,Y),均满足 0≤X≤W0 \leq X \leq W0≤X≤W 且 0≤Y≤H0 \leq Y \leq H0≤Y≤H。
K 理事长设计方案的候选共有多少种不同的四颗星 A,B,C,DA, B, C, DA,B,C,D 的选择方式呢?
任务
给定海报的尺寸和星星的信息,编写程序计算构成 K 理事长设计候选的四颗星 A,B,C,DA, B, C, DA,B,C,D 的选择方案数。
输入格式
从标准输入读取以下输入数据:
- 第 111 行包含三个以空格分隔的整数 N,W,HN, W, HN,W,H,分别表示海报上星星的数量、海报的宽度和高度。
- 后续 NNN 行中,第 iii 行(1≤i≤N1 \leq i \leq N1≤i≤N)包含两个以空格分隔的整数 Xi,YiX_i, Y_iXi,Yi(0≤Xi≤W0 \leq X_i \leq W0≤Xi≤W,0≤Yi≤H0 \leq Y_i \leq H0≤Yi≤H),表示星星 SiS_iSi 在海报上的坐标。
输出格式
向标准输出输出一行,包含一个整数,表示构成 K 理事长设计候选的四颗星 A,B,C,DA, B, C, DA,B,C,D 的选择方案数。
输入输出样例 #1
输入 #1
7 20 15
9 5
13 9
15 13
7 4
6 8
14 7
16 7
输出 #1
3
输入输出样例 #2
输入 #2
15 20 30
11 8
14 25
3 20
1 27
2 16
12 8
0 4
3 10
12 11
5 9
16 3
2 13
4 24
18 3
12 28
输出 #2
12
说明/提示
限制
所有输入数据满足以下条件:
- 4≤N≤504 \leq N \leq 504≤N≤50
- 1≤W≤10001 \leq W \leq 10001≤W≤1000
- 1≤H≤10001 \leq H \leq 10001≤H≤1000
- 0≤Xi≤W0 \leq X_i \leq W0≤Xi≤W
- 0≤Yi≤H0 \leq Y_i \leq H0≤Yi≤H
- 任意两颗星不在同一坐标
子任务
子任务 1 [80 分]
- 无论如何选择四颗星 A,B,C,DA, B, C, DA,B,C,D,圆 O1O_1O1 与圆 O2O_2O2 均不相切
子任务 2 [20 分]
无额外限制
翻译由 DeepSeek V3 完成
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,w,h;
int x[55],y[55];
bool fun(int cx,int cy,double r){
return cx-r>=0-1e-12&&cx+r<=w+1e-12&&cy-r>=0-1e-12&&cy+r<=h+1e-12;
}
bool check(int a,int b,int c,int d){
double r1_sq=1.0*(x[a]-x[b])*(x[a]-x[b])+1.0*(y[a]-y[b])*(y[a]-y[b]);
double r2_sq=1.0*(x[c]-x[d])*(x[c]-x[d])+1.0*(y[c]-y[d])*(y[c]-y[d]);
double dist_sq=1.0*(x[a]-x[c])*(x[a]-x[c])+1.0*(y[a]-y[c])*(y[a]-y[c]);
double r1=sqrt(r1_sq);
double r2=sqrt(r2_sq);
double dist=sqrt(dist_sq);
if(r1<=r2+1e-12)return false;
if(dist+r2>=r1-1e-12)return false;
if(!fun(x[a],y[a],r1))return false;
if(!fun(x[c],y[c],r2))return false;
return true;
}
int main(){
cin>>n>>w>>h;
for(int i=1;i<=n;i++)
cin>>x[i]>>y[i];
long long cnt=0;
for(int a=1;a<=n;a++) {
for(int b=1;b<=n;b++)
{
if(a==b)continue;
for(int c=1;c<=n;c++) {
if(c==a||c==b)continue;
for(int d=1;d<=n;d++) {
if(d==a||d==b||d==c)continue;
if(check(a,b,c,d))
cnt++;
}
}
}
}
cout<<cnt;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P14433 JOISC 2013 JOI 海报 JOI Poster&spm=1001.2101.3001.5002&articleId=154519679&d=1&t=3&u=d41aab4076324dbe973e76f8dce73f7d)

被折叠的 条评论
为什么被折叠?



