首页 > 其他分享 >2024牛客暑期多校训练营6 A.cake(题解)

2024牛客暑期多校训练营6 A.cake(题解)

时间:2024-08-01 19:51:32浏览次数:11  
标签:int 题解 多校 dfs 2024 dep 蛋糕 dp define

A.Cake

题意

两个人玩游戏,游戏分两阶段
第一阶段在一棵有根树上轮流走,走到叶子停止,有根树边上有 01 标记,记录下走过的 01 串
第二阶段分蛋糕,Oscar 按自己的意愿切蛋糕,然后按照第一阶段获得的 01 串顺序依次拿蛋糕(1 代表 Grammy 拿,0 代表 Oscar 拿)
两人都想让自己获得尽量多的蛋糕,求最后 Grammy 获得的蛋糕比例

分析

注意到是后手分蛋糕,然后观察样例,容易发现几个显然结论:如果第一步只有0,那么肯定只分一大块蛋糕,字符串开头是0,后手直接一步选完了。然后样例里面,字符串是10的话,后手会选择平均分,各拿一半。
然后就会猜,会不会是看前面有几个连续的1,然后对应平均分那么多份,到了0,就刚好拿走那一份分完。
不过很快就会有个反例,即11010000000000,最前面是110,如果平均分3份,显然是不如全部平均分,后手拿的会更多。
所以这样就可以看出来,似乎是看某个前缀的0占比最大,然后分这么多份,就可以让后手拿的最多。
发现这个结论后就很好写了,叶子节点的前缀最大0比值是确定的,每个结点根据当前是先手还是后手走,后手就往儿子中这个比值最大的地方走,先手则往这个比值最小的地方走。注意比值不一定要去分别存0和1的数量,可以存一个结点的深度和0的数量,两个的商就是占比。注意特判根节点深度为0,不要除以0.而且叶子结点不能单纯看边数是1确定,要在dfs里额外开一个变量,如果没有往儿子继续dfs的结点就是叶子结点。

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define inf 0x3f3f3f3f
#define ll long long
#define pii pair<int, int>
#define db double
#define all(a) a.begin(), a.end()
using namespace std;
const int maxn = 2e5 + 10;
const int mod = 998244353;
vector<pii> G[maxn];
db dp[maxn];
int dep[maxn];
void dfs(int u, int f, int tot) {
    if (dep[u])
        dp[u] = tot / (db)dep[u];
    else
        dp[u] = 0;
    dp[u] = max(dp[u], dp[f]);
    int cnt = 0;
    for (auto [v, w] : G[u]) {
        if (v == f)
            continue;
        cnt++;
        dep[v] = dep[u] + 1;
        dfs(v, u, tot + (w == 0));
    }
    if (!cnt)
        return;
    if (dep[u] & 1) {
        dp[u] = 0;
        for (auto [v, w] : G[u]) {
            if (v != f)
                dp[u] = max(dp[u], dp[v]);
        }
    } else {
        dp[u] = 1;
        for (auto [v, w] : G[u])
            if (v != f)
                dp[u] = min(dp[u], dp[v]);
    }
}
void solve() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        G[i].clear();
    for (int i = 1; i < n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        G[u].emplace_back(v, w);
        G[v].emplace_back(u, w);
    }
    dfs(1, 0, 0);
    cout << fixed << setprecision(12) << 1 - dp[1] << "\n";
}
signed main() {
    // freopen("2.in", "r", stdin);
    // freopen("2.out", "w", stdout);
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

标签:int,题解,多校,dfs,2024,dep,蛋糕,dp,define
From: https://www.cnblogs.com/TJUHuangTao/p/18337357

相关文章

  • 河南萌新联赛2024第(三)场:河南大学
    Circle画出4个圈的交叉所以就是124814,从第二个数开始,每个+2,+4,+6,....以此类推。voidsolve(){inta[1000005]={0};a[0]=1;a[1]=2;for(inti=2;i<1000005;i++){a[i]=a[i-1]+2*(i-1);}intn;cin>>n;while(n--)......
  • 2024牛客暑期多校训练营6
    Preface警钟长鸣,经典一个变量拿来跑两次循环然后挂了看不出来,主要这种睿智错误只有像我这种把循环变量声明在开头的人才会犯当时看了半天没看出来红温了,还把队友都摇过来看,然后三个人全红温了直到最后瞎JBassert了半天才发现这个问题,然后罚时爆炸,会的题也没时间写了,直接掉大......
  • 奇怪数学题 (更新至 20240801)
    1\[\color{#40865d}(2)\]\(f(x)=x^{2}-a(x+a\lnx)(a\neq0)\),若\(f(1)+f'(1)=0\)且\(a\gt0\),问可以得到什么最值相关的不等式结论\[\texttt{Sol.}\]\[f(x)=x^{2}-ax-a^{2}\lnx\]\[f'(x)=2x-a-\frac{a^{2}}{x}\]\[2-a-a^{2}+1-a=0\]解得\(a_{1}=1,......
  • 杭电多校 2024 游记
    前言和ppip还有b6e0_组的队,team102。2024-07-19Round1自己过了2,8,12,5。2024-07-22Round2自己过了8,3,2。2024-07-26Round3自己过了8,11,12,5。2024-07-29Round4自己过了5,4,7。......
  • 2024.8.1 作业
    使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源代码:/*******************************************/文件名:threadwork.c/*******************************************/#include<myhead.h>//创建传输信息的结构体......
  • CF1997F Chips on a Line 题解
    注意到操作是可逆的,可以先把所有筹码移动到位置\(1\),再进行若干次操作使筹码数量最小化。那么我们只需要对每一个\(i\)知道有多少种情况把筹码全移动到位置\(1\)后恰好有\(i\)个筹码,和这类情况的最少筹码数。记\(f_i\)表示斐波那契数列的第\(i\)项,显然一个位置\(i\)......
  • ubuntu2024 安装 postgresql最新版
    1、执行以下命令来创建文件存储库配置:sudosh-c'echo"debhttp://apt.postgresql.org/pub/repos/apt$(lsb_release-cs)-pgdgmain">/etc/apt/sources.list.d/pgdg.list' 2、导入存储库签名密钥:wget--quiet-O-https://www.postgresql.org/media/keys/ACCC4CF8.as......
  • C高级(学习)2024.8.1
    目录shell命令数组数组的赋值数组的调用遍历数组函数函数的定义方式函数调用分文件编程源文件头文件include引用时“”和<>的区别编译工具gcc编译工具gdb调试make工具定义Makefile格式Makefile管理多个文件Makefile变量自定义变量预定义变量自动变量Ma......
  • 【笔记】杂题选讲 2024.8.1 下午
    [AGC018F]TwoTrees[AGC018F]TwoTrees-洛谷|计算机科学教育新生态(luogu.com.cn)先判一下奇偶性。考虑做一个很强的钦定,奇数都填\(\pm1\),偶数都填\(0\)。对于同一棵树的一棵子树,考虑对子树内两个奇数点做匹配,要求匹配上的点一个\(+1\)一个\(-1\),这样就能在子树的根......
  • 组合数学学习笔记(二)(2024.7.4)
    一、鸽巢原理1.鸽巢原理将\((\sum\limits_{i=1}^n{p_i})-n+1\)放入\(n\)个盒子,一定存在一个盒子\(i\),使得第\(i\)个盒子至少装了\(p_i\)个物品。练习一有十个数\(a_1,a_2\dotsa_{10}\)满足\(\forall_{1\leqi\leq10}{1\leqa_i\leq60}\),证明能够从\(a_i\)中挑......