首页 > 其他分享 >D. World is Mine 题解(动态规划, 思维)

D. World is Mine 题解(动态规划, 思维)

时间:2025-01-05 18:11:17浏览次数:1  
标签:begin int 题解 Mine mp 蛋糕 World 美味 dp

原题链接:

https://codeforces.com/contest/1987/problem/D

思路:

动态规划, 思维。

A, B两人吃蛋糕,A吃的蛋糕要求美味度单调递增,所以决定她吃的蛋糕多少就是吃到的蛋糕美味度的种数。

对于答案,A从美味度最小的开始吃,吃到该美味度的一块即有效,而B需要将这个美味度的所有蛋糕都吃掉才有

效,那么我们重点考虑蛋糕美味度的种类。

此时已经明显是一个动态规划。

二维数组记录到第i个蛋糕当B还可以选j次时B完全吃掉的蛋糕种类数。

B不吃当前蛋糕:dp[i][j+1]=dp[i-1][j];

B能吃下当前蛋糕:
   dp[i][j-mp[a[i]]]=max(dp[i-1][j]+1, dp[i][j-mp[a[i]]]);

有点逆向思维

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7;
const int xmmm=2e5+10;
int dp[5010][5010];
vector<int>a;
void in(){
    a.clear();
}
void inn(int cnt){
    for(int i=1;i<cnt;i++){
        for(int j=0;j<=i+1;j++){
            dp[i][j]=0;
        }
    }
}
void solve(){
    in();//将a清0;
    int n;cin>>n;
    map<int, int>mp;//统计a数组里面每个元素出现的次数
    for(int i=1;i<=n;i++){
        int t;cin>>t;
        a.push_back(t);mp[t]++;
    }
    sort(a.begin(), a.end());
    int cnt=unique(a.begin(), a.end())-a.begin();//去重, 以及统计现在a数组里面元素个数
    for(int i=1;i<cnt;i++){
        for(int j=0;j<=i;j++)dp[i][j+1]=dp[i-1][j];
        for(int j=0;j<=i;j++){
            if(j>=mp[a[i]]){
                dp[i][j-mp[a[i]]]=max(dp[i-1][j]+1, dp[i][j-mp[a[i]]]);
            }
        }
    }
    int ans=0;
    for(int i=0;i<=cnt;i++)ans=max(ans, dp[cnt-1][i]);
    cout<<cnt-ans<<'\n';
    inn(cnt);//将dp数组初始化
    return ;
}

signed main()
{
    int T;cin>>T;
    while(T--){
        solve();
    }
    return 0;
}

总结:

写出这个dp实属不易,在dp更新的地方也想了很久也改了很久。

写出来好多了, 理解更深刻了写出来会更容易。

其实就是想清楚, A先选,B根据是否有足够多的剩余次数去吃下当前蛋糕来更新。

标签:begin,int,题解,Mine,mp,蛋糕,World,美味,dp
From: https://www.cnblogs.com/1747176348mi/p/18653626

相关文章

  • B. 树上的回忆 (memory) 题解
    \(dis(i,j)\)有两种转换方式,第一种是统计每条边被经过了多少次,第二种是变成\(\sum_{i=l}^{r}\sum_{j=l}^{r}dep(lca(i,j))\)。这里采用第二种(因为第一种寄了)。先考虑暴力,采取换根DP:把\([l,r]\)建一棵虚树。对于一个点\(x\)尝试计算\(\sum_{y}dep(lca(x,y))\)。\(y\)......
  • Codeforces 319B Psychos in a Line 题解 [ 绿 ] [ 单调栈 ] [ 动态规划 ] [ adhoc ]
    PsychosinaLine:很好的单调栈优化dp题!观察我们先观察,一个精神病人会一直杀到什么时候。显然,会杀到右边第一个比他大的精神病人那里,然后他就杀不动了。因此我们可以从右往左考虑,算出左边的精神病人杀掉这个精神病人后左边的人的答案是什么。假设左边的人目前已经刀了\(x\)......
  • 题解:AT_abc203_e [ABC203E] White Pawn
    由于\(m\le2\times10^{5}\),所以可以把有黑格子的行扔到一个map里面,然后再用一个set存储当前能走到哪些格子。按照题意暴力转移,开两个vectorin和out,分别存储哪些格子要删掉,哪些格子要加入。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;int......
  • [WC2014] 紫荆花之恋 题解
    啊啊啊啊啊啊啊啊啊啊啊我终于改完啦啊啊啊啊啊啊啊。因为没有在最开始的时候将所有点设置为已经重构的,所以直接\(R15-R70\)间卡了两三天。似乎也是我第一次大规模使用指针了。这道题假如只有一次询问,就是一道简单淀粉质,直接在根节点建立平衡树,记录\(r_x-dis(x,rt)\),然后找......
  • 在Minecraft游戏里创建一个智能的AI实体
    通过MOD,在Minecraft中创造一个像“ChatGPT”的虚拟实体,它拥有自主意识、行为和决策能力,不需要玩家指令,而是根据环境和局势自主行动的实体。1.构架首先,使用Minecraft的MOD框架(如Forge或Fabric)来为这个实体定义行为和外观,确保它能像玩家一样自由行动。想要让实体具有“思维”......
  • [CF2053E] Resourceful Caterpillar Sequence 题解
    显然两步之内决胜负。否则两个人会来回拉扯,平局。考虑何时Aron会赢。称与叶子结点边距离小于等于\(1\)的结点为【制胜点】。开局\(q\)在叶子,\(p\)不在叶子,直接赢。方案数\(c(n-c)\),其中\(c\)为叶子数量。\(q\)在一个连着【制胜点】的点,\(p\)不在【制胜点】。Nora......
  • [CF2043D] Problem about GCD 题解
    首先的一个观察是可以把\(G\)除掉,转化成\([\lceil\frac{l}{G}\rceil,\lfloor\frac{r}{G}\rfloor]\)中的两个互质数的差最大值。然后的性质非常神奇。令\(l'\gets\lceil\frac{l}{G}\rceil,r'\gets\lfloor\frac{r}{G}\rfloor\)。若\(r'-l'\)充分大,则一定有一组......
  • P4229 某位歌姬的故事 题解
    题目描述\(T\)组数据,求有多少个长为\(n\)的数组\(h\)满足\(1\leh_i\lea\)和以下\(q\)条限制:\[\max_{l_i\lej\leh_i}h_j=w_i\]对\(998244353\)取模。数据范围\(1\leT\le20\)。\(1\len,a\le9\cdot10^8,1\leq\le500\)。\(1\lel_i\ler_i\len,......
  • P5680 [GZOI2017] 共享单车 题解
    题目传送门前置知识最短路|最近公共祖先|虚树解法题目中所说的回收路线树即以\(k\)为根节点的最短路径树,可以使用Dijkstra构建。标记回收区域本质上是对回收区域构建虚树,然后就和luoguP2495[SDOI2011]消耗战基本一致了,根据儿子节点的投放状态进行树形D......
  • 高频 Python 面试题解析(附代码解释)
    高频Python面试题解析(附代码解释)引言Python作为目前最受欢迎的编程语言之一,广泛应用于Web开发、数据分析、人工智能等领域。在面试中,Python的基础知识、数据结构、算法等方面的高频问题总是被考察。因此,在这篇文章中,我们将深入剖析一些常见的Python面试题,帮助你轻松应对面试挑......