首页 > 其他分享 >CF 1981 D. World is Mine (*1800) DP+博弈论

CF 1981 D. World is Mine (*1800) DP+博弈论

时间:2024-07-03 16:42:11浏览次数:22  
标签:const 1981 int 1800 Alice Mine 蛋糕 Bob define

CF 1981 D. World is Mine (*1800) DP+博弈论

题目链接

题意

有 \(n\) 个蛋糕, 每个蛋糕有一个美味值 \(a_i\), \(Alice\) 和 \(Bob\) 轮流吃蛋糕, \(Alice\) 每次必须选择吃严格大于之前所吃的蛋糕美味程度。 \(Bob\) 随意选择。有人没有蛋糕可以吃时,游戏结束。 \(Alice\) 想吃更多蛋糕,\(Bob\) 想要阻止。

双方均采用最优策略,求 \(Alice\) 最多能吃多少蛋糕。

思路

贪心的去思考,我们注意到 \(Alice\) 选择蛋糕的策略是固定的,每次只会选择剩余蛋糕中,大于之前蛋糕美味值的最小美味值的蛋糕。而对于 \(Bob\) 来说,他如果想要让 \(Alice\) 少吃一种蛋糕,就必须把这种美味值的蛋糕全部吃掉,否则没有意义。所以对于 \(Bob\) 来说,每种蛋糕要么不吃,要么就全部吃完。不妨考虑 \(DP\), 令 \(f_{i,j}\) 表示对于前 \(i\) 种蛋糕,后手吃完了其中的 \(j\) 个,至少需要多少次操作。那么我们如果取走的 \(j\) 种蛋糕共有 \(x\) 个。那么一定要满足 $x \le i - j $ 才可以,否则没法在Alice取之前全部取走。

代码

#include<bits/stdc++.h>

using namespace std;

#define ff first
#define ss second
#define pb push_back
#define all(u) u.begin(), u.end()
#define endl '\n'
#define debug(x) cout<<#x<<":"<<x<<endl;

typedef pair<int, int> PII;
typedef long long LL;
const int inf = 0x3f3f3f3f;
const int N = 1e5 + 10, M = 105;
const int mod = 1e9 + 7;
const int cases = 1;

void Showball(){
   int n;
   cin>>n;
   vector<int> cnt(n+1);
   for(int i=0;i<n;i++){
      int x;
      cin>>x;
      cnt[x]++;
   }
   vector<int> cand;
   for(int i=1;i<=n;i++){
      if(cnt[i]) cand.pb(cnt[i]);
   }
   int m=cand.size();
   vector<int> f(m+1,inf);
   f[0]=0;
   for(int i=0;i<m;i++){
      auto nf=f;
      for(int j=0;j<i;j++){
         if(f[j]+cand[i]<=i-j){
            nf[j+1]=min(nf[j+1],f[j]+cand[i]);
         }
      }
      f=nf;
   }
   int ans=inf;
   for(int i=m;i>=0;i--) if(f[i]!=inf) return cout<<m-i<<endl,void();
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int T=1;
    if(cases) cin>>T;
    while(T--)
    Showball();
    return 0;
}

标签:const,1981,int,1800,Alice,Mine,蛋糕,Bob,define
From: https://www.cnblogs.com/showball/p/18282097

相关文章

  • D. World is Mine
    原题链接题解1.alice的策略一定是从小到大一个一个拿2.为了让alice拿不到某特定值的蛋糕,bob需要在alice拿它之前把它拿完3.在最优策略中,bob一定可以从小拿到大4.设此时bob要拿完第\(i\)类蛋糕,该类蛋糕个数为\(k\)则拿完这个蛋糕bob还有\(i-k-1\)个回合可以用,所以从前面......
  • CF 1968 F. Equal XOR Segments (*1800) 思维
    CF1968F.EqualXORSegments(*1800)思维题意:给你一个长度为\(n\)的数组,如何可以把数组分成\(k(k>1)\)组,并且使得每组的异或和相等,那么这个数组就是完美的。现在给你\(q\)组询问,每次给你\(l,r\)。请你判断\(a_l\)到\(a_r\)之间是否是完美的。思路:对于每次询问......
  • 强大的网页数据库管理工具Adminer
    老苏折腾过的项目,数据库主要是MySQL,其次是MongoDB、PostgreSQL和SQLite,最近还用到了Elasticsearch,但是数据库管理软件phpMyAdmin只能管理MySQL,老苏一直在找一个全能的数据库管理器,似乎Adminer可以满足要求。什么是Adminer?Adminer(原phpMinAdmin)是一个用PHP编......
  • 【python】用panda3d实现简易版《Minecraft》
    1.下載panda3d等等     panda3d是python的一个第三方库,在Windows的cmd下输入即可下載:pipinstallpanda3d     另外还用了 PIL,Pmw,ttkbootstrap這些第三方库,下載方式同上。。。2.方块模型     对于建模小白来说,blender有亿点难!! (资源放......
  • Minecraft Deluxehub 超好用大厅插件 中文文档
    最近发现了一个minecraft服务器大厅插件,可以实现菜单管理、大厅物品管理,掉落伤害等等等好用的大厅功能,不过是英文的配置文件,我自己翻译了一下MinecraftDexluxehub中文文档原插件是纯英文的,大家有需要可以拿走,记得对好版本号,我这里是3.5.5看一下我配置了一下的效果:Deluxeh......
  • 使用 jar 方式,快速运行 minecraft-service
    在Linux系统中,要将命令封装成.service文件,需要创建一个systemd服务单元文件。下面是创建一个名为minecraft.service​的示例,它会运行你提供的java​命令来启动MinecraftSpigot服务器。打开终端。使用文本编辑器创建一个新的.service文件。你可以使用nano​或者vi​。例如:s......
  • T461430 「Daily OI Round 4」Mine
    T461430「DailyOIRound4」MineT461430「DailyOIRound4」Mine解题思路首先,有个简单的想法就是我们考虑选择的那个采矿点是谁,但是我们发现,如果直接算,会重复,比如采矿点\(A\)和采矿点\(B\)所能采集的线段集合如果有交,显然会方案数会重复。这里学到一个计数的技巧:考......
  • 基于BungeeCord搭建 多服务端 Minecraft 我的世界 Bedwars服务器 教程
    本文基于BungeeCord搭建多服务我的世界起床战争服务器本文章后续会持续更新由于多世界插件EssentialsX-Core与Bedwars1058在部分指令上有冲突,于是建议使用BungeeCord(之后我简称BC)搭建多服务端minecraft服务器,将起床Bedwars服务分离出来,顺便将其他的服务比如登陆大厅等分离出......
  • GB-T 18003-2024 人造板机械 设备型号编制方法
    GB-T18003-2024人造板机械设备型号编制方法编写背景随着人造板行业的快速发展,标准化的设备型号编制方法对于提高行业内部的沟通效率、促进设备管理的规范化具有重要意义。GB-T18003-2024标准是针对人造板机械领域制定的一项国家级推荐性标准,旨在统一人造板机械设备的......
  • CSP历年复赛题-P1981 [NOIP2013 普及组] 表达式求值
    原题链接:https://www.luogu.com.cn/problem/P1981题意解读:中缀表达式求值,只有+,*,没有括号,保留后4位。解题思路:中缀表达式求值的典型应用,采用两个栈:符号栈、数字栈,对于没有括号的情况,只需要如下步骤:1、遍历表达式每一个字符2、如果遇到数字,则持续提取数字,保存整数到数字栈3、......