其他分享
首页 > 其他分享> > The 2021 CCPC Weihai Onsite

The 2021 CCPC Weihai Onsite

作者:互联网

比赛链接:

https://codeforces.com/gym/103428

A. Goodbye, Ziyin!

题目大意:

\(n - 1\) 条边连接 \(n\) 个点,但是不知道根节点是哪个,判断有多少个节点作为根节点时,树是二叉树。

思路:

当某个节点的度等于 3 的时候,它肯定不能作为根节点。
当某个节点的度大于 3 的时候,不论如何都不可能形成二叉树,即没有一个节点能作为根节点。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a, b, e[N], ans, n;
int main(){
	cin >> n;
	for (int i = 1; i <= n - 1; ++ i){
		scanf("%d%d", &a, &b);
		e[a]++;
		e[b]++;
	}
	for (int i = 1; i <= n; ++ i){
		if (e[i] > 3){
			cout << "0\n";
			return 0;
		}
		if (e[i] <= 2) ans++;
	}
	cout << ans << "\n";
	return 0;
}

J. Circular Billiard Table

题目大意:

圆形桌面,球从边缘上某一个点以 \(\frac{a}{b}\) 这个角度入射,当球碰到桌面时,以对称的角度弹回,判断球碰撞多少次后第一次回到入射点,若不能回去,则输出 -1。

思路:

设碰撞了 \(n\) 次,总共走了 \(k\) 圈。
可以得到公式,\(n * 2 * \alpha == k * 360\),答案就是 \(n - 1\),\(n = \frac{k * 180 * b}{a}\),又因为求的是第一次回到起点的碰撞次数,所以将 180 * \(b\) 和 \(a\) 进行一个约分,再令 \(k = a\),就解出答案了。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
LL T, a, b;
void solve(){
	scanf("%lld%lld", &a, &b);
	LL t = __gcd(a, 180 * b);
	cout << 180 * b / t - 1 << "\n";
}
int main(){
	cin >> T;
	while (T--)
		solve();
	return 0;
}

标签:Onsite,Weihai,int,LL,碰撞,180,2021,节点,二叉树
来源: https://www.cnblogs.com/Hamine/p/16029602.html