P3021 [USACO11MAR] Bovine Bridge Battle S
题目描述
Farmer John 的每头牛(共 N N N 头, 4 ≤ N ≤ 1 , 000 4 \le N \le 1,000 4≤N≤1,000)都耐心地在主牧场等待,其中第 i i i 头牛位于整数坐标 ( X i , Y i ) (X_i, Y_i) (Xi,Yi) 上( − 1 , 000 , 000 , 000 ≤ X i ≤ 1 , 000 , 000 , 000 -1,000,000,000 \le X_i \le 1,000,000,000 −1,000,000,000≤Xi≤1,000,000,000, − 1 , 000 , 000 , 000 ≤ Y i ≤ 1 , 000 , 000 , 000 -1,000,000,000 \le Y_i \le 1,000,000,000 −1,000,000,000≤Yi≤1,000,000,000)。
这些牛希望组成四个一组,以便玩他们的新宠卡牌游戏「桥牌」。每组必须满足一个重要的约束条件:如果且仅如果在平面上存在某个点 X X X(并且不与潜在四牛组的任何四个点重合),使得围绕该点 X X X 将组内任意一头牛旋转 180 180 180 度后得到组内的另一头牛的位置,四头牛才可以组队。
请帮助这些牛确定可以组成桥牌组的四牛组合的数量。
例如,假设有八头牛分别站在八个点上:
|
f*
| a = (-3, 1) e = (-1, 1)
b* | b = (-2, 2) f = ( 0, 3)
a e | c = (-3, 0) g = ( 2, 0)
* * | d = (-2, 0) h = ( 3, 0)
c d | g h
---------*–*-----±----*–*---------
|
那么,三个合法的四牛组合是 {a, b, e, d}(它们围绕点
(
−
2
,
1
)
(-2, 1)
(−2,1) 旋转),{b, c, e, f}(围绕点
(
−
1.5
,
1.5
)
(-1.5, 1.5)
(−1.5,1.5)),以及 {c, d, g, h}(围绕点
(
0
,
0
)
(0,0)
(0,0))。
提供的牛的位置都是不同的,尽管它们的顺序没有特定的规则。此外,答案将适合一个有符号的 32 位整数。
输入格式
* 第 1 行:一个整数: N N N
* 第 2 行到第 N + 1 N+1 N+1 行:第 i + 1 i+1 i+1 行包含两个用空格分隔的整数: X i X_i Xi 和 Y i Y_i Yi
输出格式
* 第 1 行:一个整数,表示可以组成桥牌有效组的四牛组合的数量。
输入输出样例 #1
输入 #1
8
-3 0
-2 0
-1 1
0 3
2 0
-3 1
3 0
-2 2
输出 #1
3
说明/提示
(由 ChatGPT 4o 翻译)
C++实现
#include<bits/stdc++.h>
using namespace std;
int n,ans,x[1005],y[1005];
map<pair<int,int>,int>p;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d%d",&x[i],&y[i]);
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
p[make_pair(x[i]+x[j],y[i]+y[j])]++;
}
}
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
ans+=p[make_pair(x[i]+x[j],y[i]+y[j])]-1;
}
}
printf("%d\n",ans/2);
return 0;
}
后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容