news 2026/4/16 15:27:00

P10570 [JRKSJ R8] 网球

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P10570 [JRKSJ R8] 网球

记录73

#include<bits/stdc++.h> using namespace std; long long gcd(long long a,long long b){ return b?gcd(b,a%b):a; } int main(){ int T; long long a,b,c,t; cin>>T; while(T--){ cin>>a>>b>>c; t=gcd(a,b); a/=t; b/=t; t=min(a,b); if(c%t==0) c/=t; else c=c/t+1; cout<<a*c+b*c<<endl; } return 0; }

题目传送门https://www.luogu.com.cn/problem/P10570


突破口

你有两个啮合在一起的齿轮,你希望齿轮 A 每转 a 圈齿轮 B 都能转恰好 b 圈。

由于精细度要求,每个齿轮都必须有不少于c 个齿,求齿轮 A 和齿轮 B 的总齿数和的最小值。


思路

两个啮合齿轮:

  • 齿轮 A 转a圈 → 齿轮 B 转b
  • 啮合齿轮的齿数与转速成反比

A 的齿数:B 的齿数=b:a

B 的齿数:A 的齿数​=a:b​

即:

A_teeth:B_teeth=b:a

A_teeth:B_teeth=b:a

✅ 所以设:

  • A 齿数 =k * b
  • B 齿数 =k * a
    其中k是正整数(比例缩放因子)

约束:每个齿轮至少c个齿
k * b ≥ ck * a ≥ c

目标:最小化总齿数 = k(a + b)*
→ 即找最小的正整数k,使得:

k≥⌈c/a⌉且k≥⌈c/b⌉

→ 所以:

k=max⁡(⌈c/a⌉,⌈c/b⌉)

但注意!这里ab原始输入值,我们需要先约分!


🔑 关键:必须用最简比例!

因为如果ab有公因数,直接用会导致k不是最小。

例如:a=4, b=8

  • 原始比例:A:B = 8:4 = 2:1
  • 最简比例:a'=1, b'=2(因为 gcd(4,8)=4)
  • 所以 A 齿数 =k*2, B 齿数 =k*1
  • 约束:2k ≥ c,k ≥ ck ≥ max(ceil(c/2), ceil(c/1)) = c
  • c=5k=5→ A=10, B=5 → 总=15(符合样例)

所以第一步:a:b化为最简整数比


代码简析

long long gcd(long long a, long long b){ return b ? gcd(b, a % b) : a; }
  • 实现欧几里得算法,求最大公约数(GCD)
int main(){ int T; long long a, b, c, t; cin >> T;
  • 读入测试数据组数T
  • a, b, c:题目输入
  • t:临时变量(用于存 gcd 或 min)
while(T--){ cin >> a >> b >> c;
  • 读入每组数据

🔥 第一步:约分比例
t = gcd(a, b); a /= t; b /= t;
  • a : b化为最简整数比
  • 例如:a=4, b=8gcd=4a=1, b=2
  • 此时,齿轮齿数比例为 B:A = a:b(注意方向!)

💡 回顾:A 转a圈 → B 转b
→ A 齿数 / B 齿数 = b / a
→ 所以 A 齿数 =k * b,B 齿数 =k * a

✅ 约分后,ab互质,此时k取最小值即可保证齿数最小。


🔥 第二步:计算最小缩放因子k
t = min(a, b);
  • 这里t被重用,表示min(a, b)(约分后的)

❓ 为什么取min(a, b)

看约束:

  • A 齿数 =k * b ≥ ck ≥ ceil(c / b)
  • B 齿数 =k * a ≥ ck ≥ ceil(c / a)

所以k = max( ceil(c/a), ceil(c/b) )

但代码却写:

if(c % t == 0) c /= t; else c = c / t + 1;

这看起来像是在算ceil(c / t),其中t = min(a, b)

这是错误的吗?


🚨 重大疑问:为什么用min(a, b)而不是分别计算?

我们用样例验证:

样例 1:a=2, b=3, c=4
  • gcd(2,3)=1 → a=2, b=3
  • t = min(2,3) = 2
  • c=4,4 % 2 == 0→ c = 4/2 = 2
  • 输出:a*c + b*c = (2+3)*2 = 10

但按正确逻辑:

  • A 齿数 =k * b = 3k ≥ 4→ k ≥ 2(因为 3×1=3<4)
  • B 齿数 =k * a = 2k ≥ 4→ k ≥ 2
  • k = 2 → 总齿数 = 3×2 + 2×2 = 10 ✅

这里min(a,b)=2ceil(4/2)=2,而ceil(4/3)=2,所以max=2,和ceil(c / min(a,b))相等。

样例 2:a=4, b=8, c=5
  • gcd=4 → a=1, b=2
  • t = min(1,2)=1
  • c=5,5%1==0→ c=5
  • 输出:(1+2)*5=15

正确逻辑:

  • A 齿数 = 2k ≥5 → k≥3(2×2=4<5)
  • B 齿数 = 1k ≥5 → k≥5
  • k = max(3,5)=5 → 总=2×5+1×5=15 ✅

min(a,b)=1ceil(5/1)=5,而ceil(5/2)=3max=5,等于ceil(c / min(a,b))

样例 3:a=5, b=2, c=8
  • gcd=1 → a=5, b=2
  • t = min(5,2)=2
  • c=8,8%2==0→ c=4
  • 输出:(5+2)*4=28

正确逻辑:

  • A 齿数 = 2k ≥8 → k≥4
  • B 齿数 = 5k ≥8 → k≥2(5×1=5<8, 5×2=10≥8)
  • k = max(4,2)=4 → 总=2×4+5×4=28 ✅

min(a,b)=2ceil(8/2)=4ceil(8/5)=2max=4=ceil(c / min(a,b))


✅ 发现规律!

因为:

  • k ≥ ceil(c / a)k ≥ ceil(c / b)
  • ceil(c / x)x减函数(x 越大,值越小)
  • 所以max(ceil(c/a), ceil(c/b)) = ceil(c / min(a, b))

✅ 证明:

  • m = min(a, b),则m ≤ am ≤ b
  • 所以c/m ≥ c/ac/m ≥ c/b
  • 因此ceil(c/m) ≥ ceil(c/a)ceil(c/m) ≥ ceil(c/b)
  • 又因为mab之一,所以ceil(c/m)就是两者中的较大者

回到代码

t = min(a, b); if(c % t == 0) c /= t; else c = c / t + 1;
  • 这就是在计算k = ceil(c / t) = ceil(c / min(a, b))
  • 然后c被重用为k
cout << a * c + b * c << endl;
  • 总齿数 =k * a + k * b = k * (a + b)
  • 注意:这里ab约分后的值
  • A 齿数 =k * b,B 齿数 =k * a,总和 =k*(a + b)

⚠️ 虽然变量名a, b容易让人混淆方向,但因为加法交换律,a*c + b*c = (a+b)*c,结果正确。


✅ 总结:代码逻辑链

  1. 读入a, b, c
  2. 约分a : b为最简比(除以 gcd)
  3. 计算最小缩放因子k = ceil(c / min(a, b))
    • 利用数学性质:max(ceil(c/a), ceil(c/b)) = ceil(c / min(a,b))
  4. 总齿数 = k × (a + b)
  5. 输出

🧪 再验证样例

输入约分后 (a,b)mink = ceil(c/min)总齿数
2 3 4(2,3)2ceil(4/2)=2(2+3)×2=10
4 8 5(1,2)1ceil(5/1)=5(1+2)×5=15
5 2 8(5,2)2ceil(8/2)=4(5+2)×4=28

全部匹配!


✅ 最终结论

这段代码关键之处:

  • 利用齿轮转速与齿数反比建立比例关系
  • 通过约分得到最简整数比
  • 利用数学恒等式将双上限约束简化为单上限
  • 整数除法高效计算上取整

是典型的“数学建模 + 数论优化”竞赛题解法

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 22:17:21

WordPress中if语句判断字段是否存在并输出内容

在WordPress中可以使用if语句判断字段是否存在并输出内容。基于你的需求&#xff0c;三个社交图标的完整判断代码如下&#xff1a; <?php // 微博图标 - 判断 weibo 字段 $weibo of_get_option(weibo); if (!empty($weibo)) : ?><a href"<?php echo esc…

作者头像 李华
网站建设 2026/4/15 15:46:43

三亚精选十大海鲜美食推荐,让你的味蕾一次满足

三亚的美食文化丰富多样&#xff0c;尤其以海鲜和湘菜的结合备受欢迎。此地的海鲜不仅新鲜可口&#xff0c;还有具地方特色的湘菜。比如&#xff0c;三亚柠檬酸菜鱼、冬笋炒腊肉和湘味炒海鲜等美食&#xff0c;非常值得尝试。此外&#xff0c;无论是脆皮烧鸡还是湖南血鸭&#…

作者头像 李华
网站建设 2026/4/16 11:43:18

AI视角下的 CANN 仓库架构全解析:高效计算的核心

在昇腾 AI 生态中&#xff0c;CANN&#xff08;Compute Architecture for Neural Networks&#xff09;仓库是支撑 NPU 高效计算的 “技术底座”。从 AI 开发者视角来看&#xff0c;理解 CANN 仓库的架构设计逻辑&#xff0c;不仅能解释 “为什么昇腾 NPU 算力利用率更高”&…

作者头像 李华
网站建设 2026/4/16 12:57:47

探索CANN:开源AI计算底座的关键组件与技术思想

在 AI 大模型与异构计算深度融合的时代&#xff0c;高效的计算底座是释放硬件算力的核心。CANN&#xff08;Compute Architecture for Neural Networks&#xff09;作为昇腾生态的开源 AI 计算架构&#xff0c;不仅是连接算法与昇腾 NPU 硬件的桥梁&#xff0c;更是一套凝聚了 …

作者头像 李华
网站建设 2026/4/16 12:42:30

Python requests 库,深度解析

1. 他是什么requests 是一个 Python 编写的 HTTP 客户端库。可以把它想象成一个“邮差”或者“快递员”&#xff0c;你的程序需要从网上获取数据&#xff08;比如读取一个网页内容&#xff0c;调用某个在线服务的接口&#xff09;或者向网上发送数据&#xff08;比如提交一个表…

作者头像 李华