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