2022 China Collegiate Programming Contest (CCPC) Mianyang Onsite

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]);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值