P3021 [USACO11MAR] Bovine Bridge Battle S
题目描述
Farmer John 的每头牛(共 NNN 头,4≤N≤1,0004 \le N \le 1,0004≤N≤1,000)都耐心地在主牧场等待,其中第 iii 头牛位于整数坐标 (Xi,Yi)(X_i, Y_i)(Xi,Yi) 上(−1,000,000,000≤Xi≤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≤Yi≤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)。
这些牛希望组成四个一组,以便玩他们的新宠卡牌游戏「桥牌」。每组必须满足一个重要的约束条件:如果且仅如果在平面上存在某个点 XXX(并且不与潜在四牛组的任何四个点重合),使得围绕该点 XXX 将组内任意一头牛旋转 180180180 度后得到组内的另一头牛的位置,四头牛才可以组队。
请帮助这些牛确定可以组成桥牌组的四牛组合的数量。
例如,假设有八头牛分别站在八个点上:
|
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 行:一个整数:NNN
* 第 2 行到第 N+1N+1N+1 行:第 i+1i+1i+1 行包含两个用空格分隔的整数:XiX_iXi 和 YiY_iYi
输出格式
* 第 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容