Codeforces Round #730 (Div. 2) 题解(A-D1)

本文通过四个具体的编程竞赛题目,展示了数学思维和高效算法在解决复杂问题中的关键作用。A题中,解释了如何通过分析gcd(a, b)的最大值及其影响因素快速求解。B题涉及高速公路的阻塞程度优化,通过均匀分配车辆来降低阻塞。C题探讨了概率变化下的期望计算,利用递归和动态规划求解。D题为交互式编程挑战,通过异或运算策略找到最佳猜测序列。这些实例揭示了数学和算法在编程中的重要地位。

Codeforces Round #730 (Div. 2) 题解(A-D1)

A. Exciting Bets

题目大意:

给出两个整数 a a a b b b,可以通过不断地同时对 a a a b b b加一或者减一(最低减为0),问在此过程中最大的 g c d ( a , b ) gcd(a,b) gcd(a,b)和使得 a a a b b b的最大公约数达到最大时需要的最小操作次数。

解题思路:

因为 a a a b b b是同时增加和减少的,所以 a a a b b b之间的差值是固定的。设d为gcd(a,b),那么显然d也是 ∣ a − b ∣ |a-b| ab的因数,所以d最大能取到的就是 ∣ a − b ∣ |a-b| ab

同时,我们可以发现当 g c d ( a , b ) gcd(a,b) gcd(a,b)取最大值时,即 g c d ( a , b ) = ∣ a − b ∣ gcd(a,b)=|a-b| gcd(a,b)=ab时, a a a b b b一定是 ∣ a − b ∣ |a-b| ab的倍数,所以最小操作步数就是a或者b到最近的 k × ∣ a − b ∣ k\times|a-b| k×ab( k k k为自然数)的步数。

还要加一个特判,当 a = b a=b a=b的时候 g c d ( a , b ) gcd(a,b) gcd(a,b)能取到无穷大。

其实这种题如果当场想不清楚的话可以根据样例猜猜结论,样例能过一般就能过了。

代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
LL a,b;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%lld%lld",&a,&b);
        if(a<b) swap(a,b);
        LL c=a-b;
        if(c==0) puts("0 0");
        else{
            LL d=min(b%c,c-b%c);
            printf("%lld %lld\n",c,d);
        }
    }
    return 0;
}

B. Customising the Track

题目大意:

一个长度为 n n n数组 a a a表示高速公路上有 n n n个子轨道,其中 a i a_i ai表示第 i i i个子轨道上车的数量。

给出以下定义,高速公路的阻塞程度= ∑ i = 1 n ∑ j = i + 1 n ∣ a i − a j ∣ \sum\limits_{i=1}^n\sum\limits_{j=i+1}^n|a_i-a_j| i=1nj=i+1naiaj。现在允许执行以下操作任意次:将某一辆车从一个子轨道移到另一个子轨道。

问高速公路的阻塞程度最低能达到多少。

解题思路:

其实很容易就想到将所有的车辆均匀分配个 n n n个子轨道,最好的情况就是每个子轨道的车辆数都一样,其次就是会有一部分车辆多出来使得一部分子轨道比另一部分多一辆车,假设有 a a a个子轨道的车辆数是 k + 1 k+1 k+1,那么就有 n − a n-a na个子轨道的车辆数是 k k k,所以很显然阻塞程度就是 k × ( k + 1 ) k\times(k+1) k×(k+1)

至于为什么这样构造能保证正确性,我也不会完整的证明,CF官方题解中有详细的证明。简要地说说我的理解:如果成功按这种方式分配之后,任何使得当前结构发生变化的操作都会使得阻塞程度增大。

代码:
#include<cstdio>
using namespace std;
typedef long long LL;
int n;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%d",&n);
        LL sum=0;
        for(int i=0;i<n;i++){
            int t;
            scanf("%d",&t);
            sum+=t;
        }
        LL a=sum%n;
        printf("%lld\n",a*(n-a));
    }
    return 0;
}

C. Need for Pink Slips

题目大意:

一共有三种纸条 C , M , P C,M,P C,M,P,起始每种纸条抽中的概率分别是 c c c, m m m, p p p。在没有抽到 P P P纸条之前可以一直抽,抽到 P P P纸条游戏就结束了。

如果没有抽到 P P P纸条并且当前这种纸条抽中之前的概率是 a a a,那么:

  1. 如果 a ≤ v a\leq v av,那么这种纸条之后抽到的概率变成0,这种纸条不再是一个有效的纸条,并且将减少的概率 a a a平均分配给剩下的有效纸条。
  2. 如果 a > v a\gt v a>v,那么这种纸条之后抽到的概率减少v,并且将减少的概率v平均分配给剩下的有效纸条。

给出 c , m , p , v c,m,p,v c,m,p,v,问抽到纸条数量的期望。

解题思路:

这道题其实难就难在读题,把题目读懂之后做起来是很简单的。

要注意当一种纸条无效之后是不能再分配概率的,除此之外再处理一下浮点数的精度问题,数据范围很小,直接爆搜出所有情况就可以了。

代码:
#include<bits/stdc++.h>
using namespace std;
const double eps=1e-6;
double sum;
void dfs(double c,double m, double p, double v,int cnt,double val){
    if(c>eps){
        double t=min(c,v);
        if(m>eps) dfs(c-t,m+t/2,p+t/2,v,cnt+1,val*c);
        else dfs(c-t,m,p+t,v,cnt+1,val*c);
    }
    if(m>eps){
        double t=min(m,v);
        if(c>eps) dfs(c+t/2,m-t,p+t/2,v,cnt+1,val*m);
        else dfs(c,m-t,p+t,v,cnt+1,val*m);
    }
    val*=p;
    cnt++;
    sum+=cnt*val;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        double c,m,p,v;
        scanf("%lf%lf%lf%lf",&c,&m,&p,&v);
        sum=0;
        dfs(c,m,p,v,0,1);
        printf("%.8f\n",sum);
    }
    return 0;
}

D1. RPD and Rap Sheet (Easy Version)

题目大意:

交互题,有一个范围在 [ 0 , n − 1 ] [0,n-1] [0,n1]内的初始密码,最多猜n次,密码猜正确返回1,错误返回0。如果这次密码猜测错误了,密码就会发生变化。假设猜测之前的密码是 x x x,你猜的密码是 y y y,那么系统就会把密码改成 z z z,使得 x ⊕ k z = y x\oplus_k z=y xkz=y(在easy版本中k只会等于2)。 x ⊕ k y = z x\oplus_ky=z xky=z的运算规则是将 x x x y y y转换为k进制,对于每一位上 ( x i + y i ) % k = z i (x_i+y_i)\%k=z_i (xi+yi)%k=zi,例如 5 ⊕ 3 5 = ∣ 12 ∣ 3 ⊕ 3 ∣ 12 ∣ 3 = ∣ 21 ∣ 3 = 7 5\oplus_35=|12|_3\oplus_3|12|_3=|21|_3=7 535=1233123=213=7

解题思路:

因为easy版本中 k = 2 k=2 k=2,所以所有的运算都是位运算中的异或运算。又因为异或运算是自反的,所以 x ⊕ z = y ⇒ x ⊕ y = z x\oplus z=y \Rightarrow x\oplus y=z xz=yxy=z

我们可以考虑从 0 0 0一直猜到 n − 1 n-1 n1,虽然在猜的过程中,猜错的话密码会发生变化,但我们在猜的过程中与密码采取相同的变化,即每次猜测之前都与迄今为止所有猜过数字的异或和异或一下,而要实现这一想法只要拿一个变量存一下过程中的异或和就行。

代码如下:
#include<cstdio>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int n,k;
        scanf("%d%d",&n,&k);
        int cur=0,t;
        for(int i=0;i<n;i++){
            printf("%d\n",i^cur);
            fflush(stdout);
            cur^=(i^cur);
            scanf("%d",&t);
            if(t==1) break;
        }
    }
    return 0;
}

D2. RPD and Rap Sheet (Hard Version)(待补)

题目大意:

与d1题意一致,只是 k k k不局限于2.

解题思路:

k k k进制的异或运算并不是自反的,所以d1的做法不用于这道题。

以下是 **5个参考 Codeforces、AtCoder 和 OI Wiki 风格的静态网页首页模板**,专为算法竞赛、信息学奥赛(OI)和编程训练平台设计。每个模板均包含完整的 HTML + CSS 代码,可直接复制运行,具备典型特征:简洁排版、代码高亮风格、题目列表、比赛日程、排行榜等。 --- ### ✅ 模板 1:竞技编程平台首页(类似【Codeforces】风格) ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>AlgoFight - 算法对战平台</title> <style> * { margin: 0; padding: 0; box-sizing: border-box; } body { font-family: &#39;Courier New&#39;, monospace; background: #f3f3f3; color: #333; } header { background: #2c3e50; color: white; padding: 1rem 2rem; } nav ul { display: flex; list-style: none; gap: 2rem; } nav a { color: #ecf0f1; text-decoration: none; } .hero { text-align: center; padding: 3rem 1rem; background: #34495e; color: white; } .container { max-width: 1200px; margin: 2rem auto; padding: 0 1rem; display: grid; grid-template-columns: 2fr 1fr; gap: 2rem; } .card { background: white; padding: 1.5rem; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); } table { width: 100%; border-collapse: collapse; margin-top: 1rem; } th, td { padding: 0.8rem; text-align: left; border-bottom: 1px solid #ddd; } th { background: #eee; } .tag { display: inline-block; background: #e74c3c; color: white; padding: 2px 6px; border-radius: 4px; font-size: 0.8rem; } footer { text-align: center; padding: 2rem; background: #2c3e50; color: white; } </style> </head> <body> <!-- 导航栏 --> <header> <nav> <ul> <li><a href="#">主页</a></li> <li><a href="#">问题集</a></li> <li><a href="#">比赛</a></li> <li><a href="#">排名</a></li> <li><a href="#">讨论</a></li> </ul> </nav> </header> <!-- 主视觉区 --> <section class="hero"> <h1>AlgoFight</h1> <p>实时在线评测 | 编程对战 | 全球排名</p> <a href="#" style="color:#3498db;">立即参加 Round #800 →</a> </section> <!-- 内容区域 --> <div class="container"> <!-- 左侧:最新题目 --> <main> <div class="card"> <h2>近期比赛</h2> <table> <tr> <th>名称</th> <th>时间</th> <th>时长</th> <th>报名</th> </tr> <tr> <td>Div. 2 Round #800</td> <td>2025-04-05 18:00</td> <td>2小时</td> <td><a href="#">报名</a></td> </tr> <tr> <td>Educational Round</td> <td>2025-04-10 20:00</td> <td>2.5小时</td> <td><a href="#">报名</a></td> </tr> </table> </div> <div class="card"> <h2>热门题目</h2> <ul> <li>A. <strong>水题模拟</strong> (难度: 800) <span class="tag">贪心</span></li> <li>B. <strong>数组翻转</strong> (难度: 1200) <span class="tag">构造</span></li> <li>C. <strong>树上DP入门</strong> (难度: 1600) <span class="tag">动态规划</span></li> </ul> </div> </main> <!-- 右侧:排行榜 --> <aside> <div class="card"> <h3>全球排名 Top 5</h3> <ol> <li>tourist - 3800</li> <li>Benq - 3650</li> <li>jiangly - 3600</li> <li>Um_nik - 3550</li> <li>maroonrk - 3500</li> </ol> </div> <div class="card"> <h3>状态</h3> <p>在线用户:1,243人</p> <p>今日提交:9,876次</p> </div> </aside> </div> <!-- 底部 --> <footer> © 2025 AlgoFight | 类似 Codeforces算法竞赛平台 | 学习用途 </footer> </body> </html> ``` --- ### ✅ 模板 2:日本式编程竞赛平台(类似【AtCoder】风格) ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>JapanCoder - 日式算法竞赛</title> <style> body { font-family: &#39;Segoe UI&#39;, sans-serif; background: #fff; color: #333; } header { background: #00a2ed; color: white; padding: 1rem 2rem; text-align: center; } .logo { font-size: 2rem; font-weight: bold; } .contest-types { display: flex; justify-content: center; gap: 1rem; margin: 1rem 0; } .btn { background: white; color: #00a2ed; padding: 8px 16px; border: none; border-radius: 4px; cursor: pointer; } .container { max-width: 1000px; margin: 2rem auto; padding: 0 1rem; } .round { background: #f9f9f9; border: 1px solid #ddd; border-radius: 8px; padding: 1.5rem; margin-bottom: 1rem; } .info { font-size: 0.9rem; color: #666; } footer { text-align: center; padding: 2rem; background: #eee; color: #666; } </style> </head> <body> <header> <div class="logo">JapanCoder</div> <div class="contest-types"> <button class="btn">ABC</button> <button class="btn">ARC</button> <button class="btn">AGC</button> </div> </header> <div class="container"> <h2>即将举行的比赛</h2> <div class="round"> <h3>AtCoder Beginner Contest 350 (ABC 350)</h3> <p class="info">时间:2025年4月6日 星期六 20:00 - 21:40(UTC+8)</p> <p class="info">等级要求:未评级 ~ 1999</p> <p>共6题,每题100~600分,按通过人数排序。</p> <button class="btn" style="margin-top:10px;">立即报名</button> </div> <div class="round"> <h3>AtCoder Regular Contest 175 (ARC 175)</h3> <p class="info">时间:2025年4月13日 21:00 开始</p> <p class="info">目标用户:~ 2799 分选手</p> <button class="btn">查看详情</button> </div> </div> <footer> JapanCoder 是一个模拟 AtCoder 风格的编程竞赛平台,用于学习与练习。 </footer> </body> </html> ``` --- ### ✅ 模板 3:OI Wiki 风格知识库首页(信息学奥赛百科) ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>OI Wiki 中文站</title> <style> body { font-family: &#39;Microsoft YaHei&#39;, sans-serif; background: #fff; color: #333; line-height: 1.8; } header { background: #2d7dfb; color: white; padding: 1rem 2rem; } nav ul { display: flex; list-style: none; gap: 2rem; } nav a { color: white; text-decoration: none; } .hero { text-align: center; padding: 3rem 1rem; background: #f8f9fa; } .toc { max-width: 1000px; margin: 2rem auto; padding: 0 1rem; display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; } .category { background: #f1f5f9; padding: 1.2rem; border-radius: 8px; border-left: 4px solid #2d7dfb; } code { background: #f0f0f0; padding: 2px 6px; border-radius: 4px; font-family: Consolas, monospace; font-size: 0.9rem; } footer { text-align: center; padding: 2rem; background: #333; color: white; } </style> </head> <body> <header> <nav> <ul> <li><a href="#">首页</a></li> <li><a href="#">数据结构</a></li> <li><a href="#">算法</a></li> <li><a href="#">数学</a></li> <li><a href="#">杂项</a></li> </ul> </nav> </header> <section class="hero"> <h1>欢迎来到 OI Wiki</h1> <p>信息学奥林匹克竞赛 · 知识点全面整理 · 免费开源</p> <p>涵盖 C++ 基础、图论、动态规划、数论等内容</p> </section> <div class="toc"> <div class="category"> <h3>📚 基础语法</h3> <ul> <li><a href="#">输入输出</a></li> <li><a href="#">循环与条件</a></li> <li><a href="#">函数与递归</a></li> </ul> </div> <div class="category"> <h3>🧮 数据结构</h3> <ul> <li><a href="#">栈与队列</a></li> <li><a href="#">堆与优先队列</a></li> <li><a href="#">并查集</a></li> <li><a href="#">线段树</a></li> </ul> </div> <div class="category"> <h3>⚡ 算法</h3> <ul> <li><a href="#">DFS/BFS</a></li> <li><a href="#">Dijkstra 最短路</a></li> <li><a href="#">背包DP</a></li> <li><a href="#">KMP 字符串匹配</a></li> </ul> </div> <div class="category"> <h3>🔢 数学</h3> <ul> <li><a href="#">质数筛法</a></li> <li><a href="#">快速幂</a></li> <li><a href="#">GCD & LCM</a></li> <li><a href="#">组合数学</a></li> </ul> </div> </div> <footer> OI Wiki 是一个社区驱动的知识库项目,灵感来自原 OI-Wiki.org。欢迎贡献内容。 </footer> </body> </html> ``` --- ### ✅ 模板 4:简洁风算法题库首页(轻量级 OJ) ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>SimpleOJ - 简单在线判题</title> <style> body { font-family: Arial, sans-serif; margin: 0; background: #fafafa; } header { background: #444; color: white; padding: 1rem 2rem; text-align: center; } .problem-list { max-width: 800px; margin: 3rem auto; padding: 0 1rem; } .problem { background: white; padding: 1rem; margin-bottom: 1rem; border-radius: 8px; box-shadow: 0 1px 5px rgba(0,0,0,0.1); cursor: pointer; } .difficulty { float: right; color: #666; font-size: 0.9rem; } .easy { color: green; } .medium { color: orange; } .hard { color: red; } footer { text-align: center; padding: 2rem; color: #888; } </style> </head> <body> <header> <h1>SimpleOJ</h1> <p>极简风格的在线评测系统</p> </header> <div class="problem-list"> <h2>题目列表</h2> <div class="problem"> <h3>P1001 A+B Problem <span class="difficulty easy">简单</span></h3> <p>输入两个整数 a 和 b,输出它们的和。</p> </div> <div class="problem"> <h3>P1002 字符串反转 <span class="difficulty medium">中等</span></h3> <p>将一个字符串逆序输出。</p> </div> <div class="problem"> <h3>P1003 背包问题 <span class="difficulty hard">困难</span></h3> <p>给定 n 个物品,求最大价值。</p> </div> </div> <footer> SimpleOJ - 仅供学习使用的静态网页模拟题库平台 </footer> </body> </html> ``` --- ### ✅ 模板 5:多语言支持竞赛平台(国际化风格,如 CF 多语言) ```html <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> <title>GlobalContest</title> <style> body { font-family: &#39;Segoe UI&#39;, sans-serif; background: #fff; } header { background: #1a1a1a; color: white; padding: 1rem 2rem; display: flex; justify-content: space-between; align-items: center; } .logo { font-weight: bold; color: #00d1b2; font-size: 1.6rem; } .lang-switch { background: #333; color: white; border: none; padding: 6px 12px; border-radius: 4px; } .banner { text-align: center; padding: 4rem 1rem; background: #001e3c; color: white; } .features { max-width: 1000px; margin: 3rem auto; padding: 0 1rem; display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 1.5rem; } .feature { text-align: center; padding: 1.5rem; background: #f8f9fa; border-radius: 8px; } footer { text-align: center; padding: 2rem; background: #333; color: #aaa; } </style> </head> <body> <header> <div class="logo">GlobalContest</div> <select class="lang-switch" onchange="alert(&#39;语言已切换&#39;)"> <option>🌐 中文</option> <option>English</option> <option>日本語</option> <option>Русский</option> </select> </header> <section class="banner"> <h1>World Programming Championship</h1> <p>Supports 4 Languages | Real-time Rating | ICPC Rules</p> <button style="background:#00d1b2; color:white; border:none; padding:10px 20px; margin-top:20px;">Register Now</button> </section> <div class="features"> <div class="feature"> <h3>🌍 多语言支持</h3> <p>界面支持中文、英文、日文、俄文</p> </div> <div class="feature"> <h3>🏆 实时评分</h3> <p>基于 Elo 算法动态更新分数</p> </div> <div class="feature"> <h3>📜 开放题解</h3> <p>赛后可查看他人代码与官方题解</p> </div> </div> <footer> GlobalContest - Inspired by Codeforces & AtCoder | For Educational Use Only </footer> </body> </html> ``` --- ## 📦 使用说明: 1. 将任意代码保存为 `index.html` 2. 用浏览器打开即可查看效果 3. 可扩展功能: - 添加 JavaScript 实现“点击题目跳转” - 引入 Prism.js 实现代码高亮 - 使用 GitHub Pages 免费托管 ---
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值