codeforces 1064 Div.2
Dashboard - Codeforces Round 1064 (Div. 2) - Codeforces
B
a,b,n
首先认识到如果你的网页太多的话(m*b)>a你就需要在右上角点❌,否则你就需要在左上角点❌,因为后来网页的长度固定为d,所以只需要在左边守株待兔
C
观察到是一个环的缩减,起初以为是区间DP,错误想法,完全没有头绪
想到可以用链表维护一个点的左右节点,然后用优先队列排序出当前代价最小的最优选项
但是尝试过后发现自己码力不足,写不出来,但是O(N*logN)的时间复杂度是对的
后来贪心发现
1、最大的那一堆只需要移动一次,就是最后一次操作才会动
2、每一堆要想消失的话最小的代价就是max(ai,ai+1)因为ai+1可能会被更大的替换掉还不如早点止损
所以一个复杂问题就变成了
```
给你一个多集合 <span id="MathJax-Span-344" class="mrow"><span id="MathJax-Span-345" class="mi">a ,它由 <span id="MathJax-Span-347" class="mrow"><span id="MathJax-Span-348" class="mi">n 个整数 <span id="MathJax-Span-350" class="mrow"><span id="MathJax-Span-351" class="msubsup"><span id="MathJax-Span-352" class="mi">a<span id="MathJax-Span-353" class="mn">1<span id="MathJax-Span-354" class="mo">,<span id="MathJax-Span-355" class="msubsup"><span id="MathJax-Span-356" class="mi">a<span id="MathJax-Span-357" class="mn">2<span id="MathJax-Span-358" class="mo">,<span id="MathJax-Span-359" class="mo">…<span id="MathJax-Span-360" class="mo">,<span id="MathJax-Span-361" class="msubsup"><span id="MathJax-Span-362" class="mi">a<span id="MathJax-Span-363" class="mi">n 组成。您想通过以下步骤生成一个新的多集 <span id="MathJax-Span-365" class="mrow"><span id="MathJax-Span-366" class="mi">s :
- 将 <span id="MathJax-Span-368" class="mrow"><span id="MathJax-Span-369" class="mi">a 划分为任意多个非空多集 <span id="MathJax-Span-371" class="mrow"><span id="MathJax-Span-372" class="msubsup"><span id="MathJax-Span-373" class="mi">x<span id="MathJax-Span-374" class="mn">1<span id="MathJax-Span-375" class="mo">,<span id="MathJax-Span-376" class="msubsup"><span id="MathJax-Span-377" class="mi">x<span id="MathJax-Span-378" class="mn">2<span id="MathJax-Span-379" class="mo">,<span id="MathJax-Span-380" class="mo">…<span id="MathJax-Span-381" class="mo">,<span id="MathJax-Span-382" class="msubsup"><span id="MathJax-Span-383" class="mi">x<span id="MathJax-Span-384" class="mi">k ,使得 <span id="MathJax-Span-386" class="mrow"><span id="MathJax-Span-387" class="mi">a 中的每个元素都恰好属于其中一个多集。
- 最初, <span id="MathJax-Span-389" class="mrow"><span id="MathJax-Span-390" class="mi">s 是空的。从每个 <span id="MathJax-Span-392" class="mrow"><span id="MathJax-Span-393" class="msubsup"><span id="MathJax-Span-394" class="mi">x<span id="MathJax-Span-395" class="mi">i 中选择其中个模** <span id="MathJax-Span-397" class="mrow"><span id="MathJax-Span-398" class="msubsup"><span id="MathJax-Span-399" class="mi"><span id="MathJax-Span-400" class="texatom"><span id="MathJax-Span-401" class="mrow"><span id="MathJax-Span-402" class="mtext">∗ ,并将其插入 <span id="MathJax-Span-404" class="mrow"><span id="MathJax-Span-405" class="mi">s 中。
请计算通过该过程可以生成的不同多集 <span id="MathJax-Span-407" class="mrow"><span id="MathJax-Span-408" class="mi">s 的个数,模数为 <span id="MathJax-Span-410" class="mrow"><span id="MathJax-Span-411" class="mn">998<span id="MathJax-Span-412" class="mspace"><span id="MathJax-Span-413" class="mn">244<span id="MathJax-Span-414" class="mspace"><span id="MathJax-Span-415" class="mn">353 。
请注意,计算的是不同多集的个数,这意味着元素的顺序并不重要。但是,每个元素的计数却很重要,即 <span id="MathJax-Span-417" class="mrow"><span id="MathJax-Span-418" class="mo">{<span id="MathJax-Span-419" class="mn">1<span id="MathJax-Span-420" class="mo">,<span id="MathJax-Span-421" class="mn">1<span id="MathJax-Span-422" class="mo">,<span id="MathJax-Span-423" class="mn">2<span id="MathJax-Span-424" class="mo">}<span id="MathJax-Span-425" class="mo">,<span id="MathJax-Span-426" class="mo">{<span id="MathJax-Span-427" class="mn">1<span id="MathJax-Span-428" class="mo">,<span id="MathJax-Span-429" class="mn">2<span id="MathJax-Span-430" class="mo">}<span id="MathJax-Span-431" class="mo">,<span id="MathJax-Span-432" class="mo">{<span id="MathJax-Span-433" class="mn">1<span id="MathJax-Span-434" class="mo">,<span id="MathJax-Span-435" class="mn">1<span id="MathJax-Span-436" class="mo">,<span id="MathJax-Span-437" class="mn">2<span id="MathJax-Span-438" class="mo">,<span id="MathJax-Span-439" class="mn">2<span id="MathJax-Span-440" class="mo">} 都被视为不同的元素。
<span id="MathJax-Span-442" class="mrow"><span id="MathJax-Span-443" class="msubsup"><span id="MathJax-Span-444" class="mi"><span id="MathJax-Span-445" class="texatom"><span id="MathJax-Span-446" class="mrow"><span id="MathJax-Span-447" class="mtext">∗ 多集的模式定义为出现次数最多的元素;如果几个元素并列最大,那么所有元素都被视为模式。
思考过程:在做题中发现前三题AC比较顺利,这个题面感觉就是DP,而且是n^2的解法,但是根本无法战胜
问题可以转化为,一共有多种颜色每种颜色有多个,每一个颜色块可以盖住另一个不同的颜色块,问一共有多少种组合
考虑一个这个问题
一个颜色一共有cnt个,我们把画板分为表面层和被隐藏层,如果隐藏的话这cntx全部都需要在下面,满足cntx<=Σcnt(1-x)
然后对于每一个颜色来说,如果不隐藏那就要把所有颜色方块都放到表面层才是最优的,比如有4个你需要{1111},{111,1},{11,1,1},{1,1,1,1}这样所有的都在表面层才能保证你后面可以隐藏的更多,换句话说你都放在表面层的答案肯定包括你没全放在表面层的
然后按照众数的个数来说的话,cnt个颜色方块可以有cnt种众数分类即(1-cnt)
这样我们从最多的开始放置的话就成了一个递推公式
sort(all(num),greater<int>()); vector<int >dp(n+1,0); dp[0]=1; for(auto it:num) for(int j=n;j>=it;j--) dp[j]=(dp[j]+1ll*dp[j-it]*it)%998244353; int ans=0; for(int i=num.front();i<=n;i++)ans=(ans+dp[i])%998244353;

浙公网安备 33010602011771号