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可能会被更大的替换掉还不如早点止损

所以一个复杂问题就变成了

```

void solve(){
    int n;cin>>n;
    int sum=0,mi=INT_MAX;
    vector<int>sh(n);
    for(auto &it:sh)cin>>it,sum+=it,mi=min(mi,it);
    cout<<sum-mi<<endl;
    return ;
}
 ```
D
待补
来更新一下D题

给你一个多集合 <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">&hellip;<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">&hellip;<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">&lowast; ,并将其插入 <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">&lowast; 多集的模式定义为出现次数最多的元素;如果几个元素并列最大,那么所有元素都被视为模式。

 

思考过程:在做题中发现前三题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;

 

 

posted @ 2025-11-25 21:16  zhzhzhao  阅读(2)  评论(0)    收藏  举报