打卡信奥刷题(1307)用C++实现信奥 P3021 [USACO11MAR] Bovine Bridge Battle S

P3021 [USACO11MAR] Bovine Bridge Battle S

题目描述

Farmer John 的每头牛(共 N N N 头, 4 ≤ N ≤ 1 , 000 4 \le N \le 1,000 4N1,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,000Xi1,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,000Yi1,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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值