首页 > 其他分享 >TopCoder SRM616 ColorfulCoins 题解

TopCoder SRM616 ColorfulCoins 题解

时间:2024-10-15 18:21:28浏览次数:5  
标签:SRM616 二进制 题解 询问 面值 货币 TopCoder 集合 进制

TopCoder SRM616 ColorfulCoins

题意

给一套货币,保证任意两种货币存在倍数关系且颜色互不相同。已知货币的币值集合,每次可以询问一个金额,给出货币张数最小的表示方案。问最小的询问次数,使得通过已知信息可以对应货币面值和颜色。

分析

最大的面值问一个 \(\inf\) 即可。这时只需要考虑前 \(n-1\) 个面值。

将货币之间的倍数关系看做一个进制关系。每次询问一个金额就是询问一个各个位置进制不同的数。既然面值集合已知,则任何询问我们自己已经知道拆分的结果,可能混淆的只是每次询问个数都相同的不同颜色。这样问题转化为如何通过有限次询问将所有货币在所有轮贡献的集合互不相同。一个细节是全为 \(0\) 的面值无法确定,原因是根本无法知道这个货币的颜色。

这时问题已经与货币面值无关,不妨将货币的进制排序。

假设有两次询问,第一行表示该位置的进制,纵列表示填的数。举例如下:

2 2 2 3 3 3 3 3 3
0 1 1 0 1 1 2 2 2
1 0 1 2 1 2 0 1 2

注意看第三列,此时的二进制已经没有可用的数字集合。如果再加一个二进制的列就不够了,需要多加一行。可知全为 \(d\) 进制的 \(n\) 种货币可以表示 \(d^{n}-1\) 种不同金额。反过来,\(n\) 货币的系统中,使得集合互不相同的至少询问次数是 \(\lceil \log_d (n+1) \rceil\)。

进制不相同的情况怎么处理?注意到为保证合法,二进制的区间我们只用了 \(01\),而三进制下为了保证最优,同样会在较前的列只用 \(01\),于是二进制和三进制是等价的,只不过我们没有填 \(2\) 而已。

实现上,只有 \(d\) 变化的时候我们才会统计答案,答案取瓶颈的最大值。

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i < n; i++) b[i] = a[i + 1] / a[i];
    sort(b + 1, b + n);
    for (int i = 1; i < n; i++)
        if(b[i] != b[i + 1])
            ans = max(ans, lg(b[i], i+1)); // log i+1 base b_i
    cout << ans << endl;
}

标签:SRM616,二进制,题解,询问,面值,货币,TopCoder,集合,进制
From: https://www.cnblogs.com/tai-chi/p/18468148

相关文章

  • [ABC062C]/[ARC074A] Chocolate Bar 题解
    神秘分讨题(?总共\(4\)中情况。第一种:三个竖的并列:ans=min(ans,(h%3>0)*w);。第二种:三个横的并列:ans=min(ans,(w%3>0)*h);。第三种:一个横的矩形,然后是两个竖着的。For(i,1,h){ intfst=i*w; intscd=(w/2)*(h-i); intthd=(w%2>0)*(h-i)+(w/2)*(h-i); ans=min(ans......
  • 堆排序题解
    给定一个整数序列,请按非递减序输出采用堆排序的各趟排序后的结果。输入格式:测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。输出格式:对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。输入样例......
  • 「题解」Educational Codeforces Round 170 (Rated for Div. 2)
    before我不想写作业呜呜。A.TwoScreensProblemA.TwoScreensSol&Code理解题意后发现使用复制的方法完成最长公共前缀即可。#include<bits/stdc++.h>typedeflonglongll;typedefstd::pair<int,int>pii;intT;std::strings1,s2;intmain(){scanf("%d"......
  • CF1955G GCD on a grid 题解
    洛谷链接我们暴力枚举可能的答案\(k\),然后跑一边dp。设\(f_{i,j}\)表示在格子\((i,j)\)是否可以满足有一条路径可以到达该格子且该格子是否为\(k\)的倍数,递推式即为\(f_{i,j}=(k\mida_{i,j}\operatorname{and}(f_{i-1,j}\operatorname{or}f_{i,j-1}))\)最后的答......
  • ARC156C 题解
    blog。显然答案为\(0\)不行。打表发现最优答案总为\(1\)。考虑构造取到\(1\)的下界。观察到,\(\text{LCS}\le1\)等价于去掉两序列都不存在的数后,两序列完全相反。于是有:在\(\{x\},\{y\}\)后增加两序列都不存在的数,不影响LCS。进行\(\{x\}\to\{a,x,b\},\{y\}\to\{b,......
  • # Educational Codeforces Round 170 (Rated for Div. 2) 题解D
    EducationalCodeforcesRound170(RatedforDiv.2)题解DD.AttributeChecks链接:Problem-D-Codeforces思路:由于\(m\)还有\(abs(r[i])\)很小,考虑dp因为每个0能对后面多少个check做出贡献是固定的,所以预处理因为我们每次的0的个数是单调不减的所以,我们上一次......
  • 【题解】P3917 异或序列
    传送门也算是一个有关于异或的小trick吧,简单记录一下。可以维护原序列的前缀异或和\(sum\),于是原题答案贡献变为\(\sum\limits_{i=1}^n\sum\limits_{j=i}^nsum_j\oplussum_{i-1}\)。变形一下为\(\sum\limits_{i=0}^{n-1}\sum\limits_{j=1}^{i+1}sum_i\oplussum_{j}......
  • [TJOI2019] 甲苯先生的字符串 题解
    T2[TJOI2019]甲苯先生的字符串矩阵乘法优化DP,所以一般来说这种DP都不怎么难。30pts的DP是裸的:设\(f_{i,j}\)为前\(i\)位、最后一位是\(j\)的方案数,则有转移方程:\[f_{i,j}=\sum_{k=0}^{25}f_{i-1,k}\landk\nej\]想要矩阵优化,我们想到构造答案矩阵:\[\mathit{an......
  • [PA2021] Od deski do deski 题解
    T1[PA2021]Oddeskidodeski发现合法的字符串一定是类似\(\texttt{aa...aabb...bbcc...cc}\)的形式,也就是若干个\(\texttta\)、若干个\(\textttb\) 和若干个\(\textttc\) 等组成的形式。如果当前选好的串\(S_1\)是合法的,且有另一个合法的串\(S_2\),那么显然\(S_1......
  • 牛客周赛63部分题解
    比赛地址:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ(nowcoder.com)A.小红的好数#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongvoidsolve(){lln;cin>>n;if(n>=10&&n<=99......