1. 程式人生 > 其它 >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;
}