CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) A-D

这篇具有很好参考价值的文章主要介绍了CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) A-D。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1842A - Tenzing and Tsondu

题意

丁真和珍珠宝可梦对决, 每个宝可梦都有x战力, 假设有两个宝可梦, 其战力分别为a和b(a>b), 战力为a的宝可梦获胜后战力-b, 而战败的宝可梦会消失
最后还有宝可梦的人获胜
问你丁真和珍珠谁赢了

题解

显而易见, 赢下来的宝可梦可以继续打, 输了的就会消失, 所以是比战力值总和

代码

void solve()
{
    cin>>n>>m;
    vector<ll>a(n+1);
    ll u,v;
    u=v=0;
    rep(i,1,n) cin>>a[i],u+=a[i];
    vector<ll>b(m+1);
    rep(i,1,m) cin>>b[i],v+=b[i];
    if(u==v) cout<<"Draw"<<endl;
    else if(u>v)cout<<"Tsondu"<<endl;
    else cout<<"Tenzing"<<endl;
    return;
}

1842B - Tenzing and Books

题意

丁真收到了三堆书, 每堆书有 n n n本, 每本书有固定的知识值 a [ i ] a[i] a[i]
每读一本书就会使得丁真的知识值与这本书的知识值进行或运算
a n s ∣ = a [ i ] ans|=a[i] ans=a[i]
丁真会从书堆的开头第一本开始读
每当丁真不想读下去时, 他会直接放弃一整堆书
丁真想让他的知识值达到ans, 问你这可能吗

题解

因为是或运算, 思路直接来到了位运算
首先, 假设ans的二进制是10011
那么想要让丁真达到ans这个值, 我们需要注意一些点

因为是或运算, 书的知识值中二进制为0是不会对答案造成影响的
若同一个二进制位中, 书的知识值为1而答案为0, 那么就对答案造成了偏差
那么以贪心的思想, 只要不会对答案造成影响的(即 b o o k > > i & 1 book>>i\&1 book>>i&1==1&&ans>>i&1!=0), 丁真都可以读

那么答案显而易见, 对所有能读的书都给读了, 遇到不能读的书就退出书堆, 最后对比答案就可以了

代码

void solve()
{
    cin>>n>>m;
    vector<ll> a(n+1);
    ans=0;  
    rep(i,1,n) cin>>a[i];
    rep(i,1,n)//这段for重复三遍
    {
        ll mk=0;
        for(ll j=0;j<=32;j++)
        {
            cnt=(m>>j)&1;
            ant=(a[i]>>j)&1;
            if((ant&&cnt==0)) 
            {
                mk=1;
                break;
            }
        }
        if(mk) break;
        ans|=a[i];
    }

    rep(i,1,n) cin>>a[i];
    rep(i,1,n)
    {
        ll mk=0;
        for(ll j=0;j<=32;j++)
        {
            cnt=(m>>j)&1;
            ant=(a[i]>>j)&1;
            if(ant&&cnt==0) 
            {
                mk=1;
                break;
            }
        }
        if(mk) break;
        ans|=a[i];
    }

    rep(i,1,n) cin>>a[i];
    rep(i,1,n)
    {
        ll mk=0;
        for(ll j=0;j<=32;j++)
        {
            cnt=(m>>j)&1;
            ant=(a[i]>>j)&1;
            if(ant&&cnt==0) 
            {
                mk=1;
                break;
            }
        }
        if(mk) break;
        ans|=a[i];
    }
    
    if(ans==m) yes
    else no

    return;
}

解法2

CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) A-D,最短路,dp,贪心,算法,开发语言,c++
源代码出自
用&的方式省去了位运算枚举
很妙

1842C - Tenzing and Balls

题意

n个球排成一列, 每个球都有一个特定的颜色值
丁真可以选择两个颜色值一样的球, 删除这这两个球之间的所有球(包括这两个球)这个操作可以进行无限次
问你最多能删多少个球

题解

这题一开始以为是双指针假了, 其实是dp
使用两个数组进行动态规划
d数组用于存储这个元素的最优解, 而f数组用于存储当前下标的最优解(即答案)
则动态转移方程(设当前元素为x)

f[i]=min(f[i-1]+1,d[x]);//选择该元素的最优解(若没出现过则为INF), 或者不选(答案+1)
d[x]=min(f[i-1],d[x]);//该元素的最优解=当前局部最优解和元素最优解取min

最后答案为n-f[n]

代码

void solve()
{
    cin>>n;
    vector<ll>a(n+1),f(a),d(n+1,INF);
    rep(i,1,n)
        cin>>a[i];

    rep(i,1,n)
    {
        ll x=a[i];
        f[i]=min(f[i-1]+1,d[x]);
        d[x]=min(f[i-1],d[x]);
    }
    cout<<n-f[n]<<endl;
    return;
}

1842D - Tenzing and His Animal Friends

题意

这题题面很抽象, 我看了至少半小时才看懂(也可能是因为英语太菜了, 嗯造机翻)
最后看了公告才看懂的

丁真和他的n个动物朋友玩耍, 丁真非常喜欢他的1号朋友, 所以每次都要和1号朋友玩, 丁真不喜欢他的n号朋友, 所以丁真不和n号朋友玩
现在给出m个限制, 每个限制有u v w三个参数, 代表u号朋友和v号朋友不在一起的时间不超过w
(u和v同时都在和同时不在的时间不会被此条限制所影响)
丁真想尽可能用更多的时间和动物朋友们玩耍
请输出丁真最多能和动物朋友玩耍的时间和玩耍的次数
用二进制状态表示丁真和哪些动物朋友们玩耍, 并在同一行那一次输出玩耍了多久

题解

首先1和n一定要在一个连通块中, 不一定需要1和n在一条边上但一定要在一个连通块中, 若1和n不在一个连通块中, 我们就可以一直构造11111…11110这样的玩法持续无限次, 因为1和n并不相连, 所以不存在只允许出1而不出现n的次数限制 (注意题目条件n不能出现, 1必须出现) , 因此可以一直构造这样的玩法
相应的, 从1到n的最短路, 也就是此题中丁真最多能和动物朋友有玩的时间了
(这题的难度就在这里了, 当时想破了脑袋也没想出这题是个最短路)
然后将数据分为两类, 一类是可以和1一起玩的, 另一类是不能和1一起玩的
按照贪心的思想, 每次都将能和1一起有玩的所有动物朋友都加进去, 而游玩时间就是其中能和1玩的动物朋友中, 能玩时间的最小值 (也就是他到n的最短路/或者1到n的最短路 这里取最小值 再减去上一个次游玩的时间, 原因是有上一次游玩时间和这一次游玩时间有交集部分 而交集部分正好是上一次游玩的时间)
按照这样下去, 每次游玩都必定淘汰至少一个

代码

void solve()
{
    cin>>n>>m;
    rep(i,1,n) 
        rep(j,1,n)
        {
            if(i!=j) cnt=llINF;
            else cnt=0;
            a[i][j]=cnt;
        }
        
    rep(i,1,m)
    {
        ll u,v,w;
        cin>>u>>v>>w;
        a[u][v]=a[v][u]=w;
    }

    rep(k,1,n)
        rep(i,1,n)
            rep(j,1,n)
            a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
    if(a[1][n]==llINF)
    {
        cout<<"inf"<<endl;
        return;
    }

    vector<ll>d(n+1),dist;

    cnt=a[1][n];
    rep(i,1,n) 
    {
        d[i]=min(cnt,a[i][n]);
        dist.push_back(d[i]);
    }

    sort(dist.begin(),dist.end());
    dist.erase(unique(dist.begin(),dist.end()),dist.end());
    cout<<cnt<<' '<<dist.size()-1<<endl;
    cnt=0;
    repr(i,0,dist.size())
    {
        if(!dist[i]) continue;
        rep(j,1,n) cout<<(d[j]>=dist[i]);
        cout<<' '<<dist[i]-cnt<<endl;
        cnt=dist[i];
    }

    
    return;
}

这里用的Floyd求最短路, 当然你用dijkstra也是可以的文章来源地址https://www.toymoban.com/news/detail-527346.html

到了这里,关于CodeTON Round 5 (Div. 1 + Div. 2, Rated, Prizes!) A-D的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Educational Codeforces Round 139 (Rated for Div. 2)

    Educational Codeforces Round 139 (Rated for Div. 2) Problem - 1766E - Codeforces 显然我们可以把0序列的贡献单独算: i*(n-i+1)  考虑只存在1,2,3的情况. 首先通过,观察到一个重要性质: 最多只有三种序列 . 含有3或纯1或纯2型. 纯1或纯2型 纯2或纯1型 我们每次添加元素的操作, 只跟上一个位置序列

    2024年02月06日
    浏览(40)
  • Educational Codeforces Round 148 (Rated for Div. 2) 题解

    总结:5.21下午VP一场,死在了A题,给我wa崩溃了,浪费了差不多一个小时,BC还挺顺畅,虽然C题是在结束后不久交上去的。。。。 思路:其实思路很简单, “ The string s a palindrome ”, 题目已经说了所给的为回文字符串,所以直接判断一半 有几种字符 即可(开始的时候计算整

    2024年02月06日
    浏览(37)
  • Educational Codeforces Round 154 (Rated for Div. 2)(A—D)

    从1到9,每个数后面都可以加一个数构成一个含有两个数的质数,只需要从s[1]~s[9]中找到一个数与s[0]构成质数即可 观察样例即可发现两个字符串只要在相同位置都有 01 存在就能成功实现转换后两个字符串相等 可以先假设字符串是可以成立的,那么接下来就判断它什么时间是

    2024年02月10日
    浏览(36)
  • Educational Codeforces Round 154 (Rated for Div. 2)(A—C)

    从1到9,每个数后面都可以加一个数构成一个含有两个数的质数,只需要从s[1]~s[9]中找到一个数与s[0]构成质数即可 观察样例即可发现两个字符串只要在相同位置都有 01 存在就能成功实现转换后两个字符串相等 可以先假设字符串是可以成立的,那么接下来就判断它什么时间是

    2024年02月10日
    浏览(40)
  • Educational Codeforces Round 62 (Rated for Div. 2) C. Playlist

     一开始肯定要排个序,b相同时t大的在前边,不同时b大的在前面。 然后想最多只能选k个的限制,可以这样想,每次用到的b只能用已选到的最小的值,那可以把每个b都枚举一遍,然后每一次选时长最长的,且b大于等于当前的b的那k个不就好了吗,时间复杂度也才O(n),然

    2024年02月12日
    浏览(40)
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

    C. Digital Logarithm 给两个长度位 n n n 的数组 a a a 、 b b b ,一个操作 f f f 定义操作 f f f 为, a [ i ] = f ( a [ i ] ) = a [ i ] a[i]=f(a[i])=a[i] a [ i ] = f ( a [ i ]) = a [ i ] 的位数 求最少多少次操作可以使 a 、 b a、b a 、 b 两个数组变得完全相同 性质: 对于任何数,经过两次操作我们一定可以

    2024年02月20日
    浏览(38)
  • 【每日一题】—— B. Ternary String (Educational Codeforces Round 87 (Rated for Div. 2))

    🌏博客主页: PH_modest的博客主页 🚩当前专栏: 每日一题 💌其他专栏: 🔴 每日反刍 🟡 C++跬步积累 🟢 C语言跬步积累 🌈座右铭: 广积粮,缓称王! 题目大意:给你一串由1、2、3组成的数组,让你求一个最短的子串,要求这个子串包含1、2、3 题目链接:B. Ternary String

    2024年02月16日
    浏览(38)
  • Educational Codeforces Round 157 (Rated for Div. 2) F. Fancy Arrays(容斥+组合数学)

    题目 称一个长为n的数列a是fancy的,当且仅当: 1. 数组内至少有一个元素在[x,x+k-1]之间 2. 相邻项的差的绝对值不超过k,即 t(t=50)组样例,每次给定n(1=n=1e9),x(1=x=40), 求fancy的数组的数量,答案对1e9+7取模 思路来源 灵茶山艾府群 官方题解 题解 看到 至少 的字眼,首先想到容斥,

    2024年02月05日
    浏览(40)
  • Educational Codeforces Round 161 (Rated for Div. 2) E. Increasing Subsequences 动态规划逼近,二进制拆分补充,注意严格递增

    Problem - E - Codeforces 目录 推荐视频: 题意: 细节(我踩得没什么价值的坑): 思路: 对样例3 (X = 13)做解释: —————— 总思路: —————— 动态规划逼近: —————— 二进制拆分补充剩余: 核心代码:  E_哔哩哔哩_bilibili 其实有一些细节说的不是特别清楚好

    2024年02月22日
    浏览(39)
  • Educational Codeforces Round 161 (Rated for Div. 2) E题 动态规划逼近,二进制拆分补充,注意严格递增strictly increasing

    Problem - E - Codeforces 目录 推荐视频: 题意: 细节(我踩得没什么价值的坑): 思路: 对样例3 (X = 13)做解释: —————— 总思路: —————— 动态规划逼近: —————— 二进制拆分补充剩余: 核心代码:  E_哔哩哔哩_bilibili 其实有一些细节说的不是特别清楚好

    2024年01月24日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包