首页 > 其他分享 >01.03 CW 模拟赛 T1. math

01.03 CW 模拟赛 T1. math

时间:2025-01-03 17:22:40浏览次数:1  
标签:prime 10 -- res int 01.03 rm CW math

前言

赛场上 \(\rm{while}\) 打成 \(\rm{if}\) 痛失 \(40 \rm{pts}\)
不过下来看是贪心的话也没什么好做的了, 一般都不会

对了这是题目
题目下载

\(\rm{sol}\)

方法 \(1\) : 逐位计算

思路

显然的是你需要把数字从大到小填入, 使得高位的数尽量大, 这个显然
由上面的结论可以知道, 如果你从大到小考虑每一个数, 每个数填给 \(a, b\) 中的一个一定是符合最优解的构造的


考虑对于当前的数字, 填给 \(a, b\) 哪个更优
假设当前已经填过的前缀为 \(A, B\) , 显然的如果有一个的大小已经达标那么填给另一个
假设当前的数字为 \(x\) , 分类讨论计算贡献

  • \(x\) 放给 \(A\) , \(A \gets 10A + x, AB = 10AB + Bx\)
  • \(x\) 放给 \(B\) , \(B \gets 10B + x, AB = 10AB + Ax\)

发现什么?
两个贡献的形式都是 \(10AB + con\) , 而 \(AB\) 是上一次选择产生的贡献, 这证明了在这里使用贪心法使得填数之后当前贡献最大是正确的

对贡献作差, 结果是 \((B - A)x\) , 显然的

  • \(B > A\) , 填给 \(a\)
  • \(A > B\) , 填给 \(b\)

考虑 \(A = B\) 的情况
需要注意的是, 我们当前无论填给谁, 对之后的贡献都是 \(0\) , 所以这是一个全局性的考量

你发现一直填下去, 直到最后 \(A, B\) 有一个达到了 \(a, b\) 的要求, 那么接下来的贡献呢
我们钦定 \(a < b\) , 其他情况同理 (特别的, \(a = b\) 的时候可以随意填)
假设当前剩下的数为 \(x\) , 其位数为 \(b - a\)

记 \(A, B\) 前面位数相同的极大前缀为 \(A^{\prime}, B^{\prime}\)
\(\rm{belike}\) :
pEpll38.png
的黄色部分

最终的贡献柿子为

\[(B^{\prime} \cdot 10^{b - a} + x) \cdot A^{\prime} = A^{\prime}B^{\prime} \cdot 10^{b - a} + A^{\prime} x \]

我们知道的是, \(x, A^{\prime}B^{\prime}\) 并不由当前选择填给谁而决定, 而 \(A^{\prime}, B^{\prime}\) 是受影响的

所以我们应当令 \(A^{\prime}\) 尽量大, 也就是说, 我们要把这个数填给位数较小的数

总结

善于通过计算单个单位的贡献来解决一类贪心问题
拍子可以搞出一些 \(\rm{border\ case}\) 去做, 时间充裕还是要打

对贡献作差是一种常见的方法来找到最优解

方法 \(2\) : 确定性

实现

首先是学习一下常用的高精度模板, 以后避免不会用

框架

首先 \(A, B\) 的比较和乘法都需要高精度, 让我来看看这两个怎么做
补好是两个高精度相乘, 我们没救了

代码

首先是高精度不想写了, 所以写 \(\rm{python}\)

#include <bits/stdc++.h>
#define int long long
const int MAXVAL = 10;
const int MAXN = 21;

int T;
int a, b;
int num[MAXVAL];

signed main()
{
    scanf("%lld", &T);
    while (T--) {
        int ans = 0;
        scanf("%lld %lld", &a, &b);
        for (int i = 1; i <= 9; i++) scanf("%lld", &num[i]);
        int A = 0, B = 0;
        int res = 9;
        int cnt = a + b;
        for (int i = 1; i <= cnt; i++) {
            while (!num[res] && res > 0) res--;
            if (a == 0) B = B * 10 + res, b--;
            else if (b == 0) A = A * 10 + res, a--;
            else if (B > A) A = A * 10 + res, a--;
            else if (A > B) B = B * 10 + res, b--;
            else {
                if (a < b) A = A * 10 + res, a--;
                else B = B * 10 + res, b--;
            }
            num[res]--;
        }
        printf("%lld\n", A * B);
    }

    return 0;
}

标签:prime,10,--,res,int,01.03,rm,CW,math
From: https://www.cnblogs.com/YzaCsp/p/18650588

相关文章

  • 2025.01.03 LGJ Round
    A一个序列\(a\),你需要对其每个前缀计算:至少要多少次交换相邻元素的操作使得序列变为“单峰”,即由一个递增序列和一个递减序列拼起来。\(n\le5e5\)。我一开始的想法是:枚举切点,左边的数排序成递增,右边的数排序为递减,贡献是逆序对+正序对。然而这是错误,因为不保证左边的某个数去......
  • 1.3 CW 模拟赛 赛时记录
    前言还是传统手法,冲冲冲看题\(\rm{T1}\)好吧,不会高精度,寄了\(\rm{T2}\)博弈\(\rm{T3}\)我不到啊\(\rm{T4}\)看不懂思密达首先这套题肯定不是能拿大分的题,所以今天尽量多分析,给每个题留足思考时间,然后多打暴力,最后拼高分/正解以后也尽量做到看题的时......
  • 推荐一个双语对照的 PDF 翻译工具的开源项目:PDFMathTranslate
    今天给大家推荐一个双语对照的PDF翻译工具的开源项目:PDFMathTranslate。项目介绍:基于AI完整保留排版的PDF文档全文双语翻译,支持Google/DeepL/Ollama/OpenAI等服务,提供CLI/GUI/Docker。项目亮点:基于AI布局分析和PDF指令流分析实现对文档排版的完整保留;保留......
  • AI驱动的PDF翻译保留排版格式-PDFMathTranslate
    PDFMathTranslate:AI驱动的PDF双语翻译在这个信息爆炸的时代,跨语言交流的需求日益增长。无论是学术研究、商务合作还是个人学习,我们经常需要处理多语言的PDF文档。今天,我要介绍一款革命性的工具——PDFMathTranslate,它不仅能够实现PDF文档的全文双语翻译,还能完整保留原文的......
  • MATH70094 Programming for Data Science
    Assessment4MATH70094:ProgrammingforDataScienceAutumn2024Assessment4ThisassessmentcontainstwoquestionsthatwilltestyourabilitytoworkwithfilesanddatainRandPython,aswellashowtocreateandpackageyourcodeinthesetwolangua......
  • AcWing 791:高精度加法 ← string+数组
    【题目来源】https://www.luogu.com.cn/problem/P1601https://www.acwing.com/problem/content/793/【题目描述】高精度加法,相当于a+bproblem,不用考虑负数。输入不含前导0。【输入格式】分两行输入。a,b≤10^500。【输出格式】输出只有一行,代表a+b的值。【输入样例】1......
  • 12.28 CW 模拟赛 赛时记录
    前言还是只管考试的策略,别想其他的每个题控制用时,根据时间选择策略,冷静看题完蛋了是\(\rm{NOIP}\),我们没救了\(\rm{T1}\)怎么办,像是很典的题但是我多半做不出来别人做过容斥的肯定会,但是我就不一样了\(\rm{T2}\)好像也不会做\(\rm{T3}\)基环树上的\(\rm......
  • 解释下`(~~(Math.random()*(1<<24)))`的含义
    这段代码(~~(Math.random()*(1<<24)))在前端开发中可能用于生成一个随机整数。下面我们来分解这段代码,以更好地理解其含义:Math.random():这个函数返回一个[0,1)之间的随机浮点数,也就是说,它会返回一个大于等于0且小于1的随机小数。1<<24:这是一个位移运算。1左移24位,等......
  • Kevin and Math Class
    前言因为这个东西才开的这个专题,但是我现在还是不会做这道题思路你发现\(b_i\geq2\),那么至多取\(\loga_i\)次就可以清空,那么答案就有上界在\(63\)左右因为操作顺序对最终结果无影响,你考虑枚举以每个\(b_i\)作为区间最小值对于\(a\)的影响,然后你很快就......
  • 12.26 CW 模拟赛 T1. 平均
    思路首先你发现假设当前的平均数是\(a\),其中\(\lceila\rceil=k\),那么你势必要选上所有\(<k\)的数来拉低平均数,然后贪心的从小到大选\(\geqk\)的数来提高贡献如果想不到也可以这样想,对于一个确定的平均数,一定要尽可能的让比平均数小的数更多,才能更多的......