专栏文章

CF2120B Square Pool 题解

CF2120B题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mios65za
此快照首次捕获于
2025/12/03 00:16
3 个月前
此快照最后确认于
2025/12/03 00:16
3 个月前
查看原文

CF2120B Square Pool 题解

Update 2025/7/26:
修改了措辞

题目大意

在一个边长为 ss 的方形球桌上,四个角落有四个球袋,坐标分别为 (0,0)(0,0)(0,s)(0,s)(s,0)(s,0)(s,s)(s,s)。球桌内有 kk 个球,每个球都从初始位置 (x,y)(x,y)45°45° 角打出。它的方向与 dxd_xdyd_y 有关。碰到台桌会无损耗地反弹,速度不变。物理学不存在了。最后要求有多少个球能落入球袋。球碰撞了等于没碰撞。

解题思路

首先,我们要了解台球的反弹。学过初中数学的同学都知道,台球中打出球的路径入射角等于反射角。
即:
图挂了?
根据球的运动方向和初始位置,可推导出球能落入球袋的条件:
  1. dx=1dx=1dy=1dy=1 时,球的运动方向是向右上方,此时需满足 x=yx=y ,才能最终到达 (s,s)(s,s) 球袋。
  2. dx=1dx=1dy=1dy=-1 时,球的运动方向是向右下方,此时需满足 x+y=sx+y=s,才能最终到达 (s,0)(s,0) 球袋。
  3. dx=1dx=-1dy=1dy=1 时,球的运动方向是向左上方,此时需满足 x+y=sx+y=s,才能最终到达 (0,s)(0,s)球袋。
  4. dx=1dx=-1dy=1dy=-1时,球的运动方向是向左下方,此时需满足 x=yx=y,才能最终到达 (0,0)(0,0) 球袋。

代码实现

CPP
#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int k,s;
		scanf("%d%d",&k,&s);
		int count=0;
		for(int i=0;i<k;++i){
			int dx,dy,x,y;
			scanf("%d%d%d%d",&dx,&dy,&x,&y);
			if(dx==1&&dy==1){
				if(x==y)
					count++;
			}
			else if(dx==1&&dy==-1){
				if(x+y==s)
					count++;
			}
			else if(dx==-1&&dy==1){
				if(x+y==s)
					count++;
			}
			else{
				if(x==y)
					count++;
			}
		}
		printf("%d\n",count);
	}
	return 0;
}
马蜂不良,见谅。

评论

0 条评论,欢迎与作者交流。

正在加载评论...