https://codeforces.com/gym/104065
C. Catch You Catch Me
题意:每次操作都可以抓住一个节点里的所有蝴蝶(每个节点都有蝴蝶),每一分钟蝴蝶会飞向出口(节点1)(也就是从子节点集中到父节点)到达节点1的蝴蝶会立即消失。一分钟可以操作无限次,问最小的操作次数(抓完所有的蝴蝶)
思路:求出每颗子树的高,相加。蝴蝶一定会集中在与1号节点相邻的子节点所以当前子树有多少层就需要操作多少次,每颗子树相加就是总的操作数
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#define Max 0x7fffffff
#define LL long long
#define ULL unsigned long long
#define N 200005
//#define int long long
int mod = 998244353;
using namespace std;
vector<int>edge[N]; int d[N], vis[N];int n;
void dfs(int x) {
int fl = 0;
vis[x] = 1;
for (int i = 0; i < edge[x].size(); i++) {
if (vis[edge[x][i]])continue;
fl = 1;
dfs(edge[x][i]);
d[x] = max(d[edge[x][i]]+1, d[x]);
}
if (!fl)
d[x] = 1;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n - 1; i++) {
int t, t1; scanf("%d%d", &t, &t1);
edge[t].push_back(t1);
edge[t1].push_back(t);
}
dfs(1);
int ans = 0;
for (int i = 0; i < edge[1].size(); i++) {
ans += d[edge[1][i]];
}
printf("%d", ans);
}
G. Let Them Eat Cake
题意:给你n个数(不相等),在一轮中如果一个数比左右相邻的任意一个数小就可以得到蛋糕并且在这一轮结束后退出队伍退出队伍 。问需要几轮结束(只剩一个人时结束)
思路:用一个滚动数组进行模拟
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#define Max 0x7fffffff
#define LL long long
#define ULL unsigned long long
#define N 200005
//#define int long long
int mod = 998244353;
using namespace std;
int a[2][N], b[N];
int main() {
int n; scanf("%d", &n);
for (int i = 1; i <= n; i++)scanf("%d", &a[0][i]);
int p = n,j=0,ans=0,q=n;
while (p > 1) {
int t = 0;
for (int i = 1; i <= q; i++) {
if (a[j][i] < a[j][i + 1] || a[j][i] < a[j][i - 1]) { p--; continue; }
a[j^1][++t] = a[j][i];
}
memset(a[j], 0, n * sizeof(int));
j ^= 1;
ans++;
q = t;
}
printf("%d", ans);
}
M. Rock-Paper-Scissors Pyramid
题意:找出赢得次数最多的一个
思路:如果后一个可以赢前一个说明他可以继承前一个赢的次数反过来也一样。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
#include<stack>
#include<set>
#define Max 0x7fffffff
#define LL long long
#define ULL unsigned long long
#define N 2000005
//#define int long long
int mod = 998244353;
using namespace std;
char a[N];
bool check(char j, char k) {
if (j == 'P')return k == 'R';
if (j == 'S')return k == 'P';
if (j == 'R')return k == 'S';
}
int main() {
int T; scanf("%d", &T);
while (T--) {
scanf("%s", a);
int len = strlen(a);
int sum = 0, fl = 0, maxx = 0;
for (int i = 1; i < len; i++) {
if (a[i] == a[i - 1])continue;
if (check(a[i], a[i - 1]))sum++;
else sum--;
if (sum > maxx) {
maxx = sum;
fl = i;
}
}
printf("%c\n", a[fl]);
}
}