首页 > 其他分享 >「清新题精讲」MagicalHats

「清新题精讲」MagicalHats

时间:2024-05-29 20:35:03浏览次数:13  
标签:return 硬币 int res 精讲 st ++ MagicalHats 清新

SRM549 - MagicalHats

Statement

给定 \(n\times m\) 的地图,. 表示空地,H 表示帽子,帽子下会有不超过 \(1\) 个硬币。

接下来有 numGuesses 次操作,每一次魔法师将会改变硬币的位置,然后你将选择 \(1\) 个帽子,获得的价值为帽子底下硬币的价值(如果无硬币,则价值为 \(0\))

魔法师希望你获得的价值尽可能小,而你希望尽可能大,求最后的最大价值。

Solution

观察一些性质:如果获得的硬币数为 \(x\),则价值为硬币从小到大排序后前 \(x\) 小的和。

问题进而转化为求最多能拿到多少个硬币。考虑对于 \(1\) 个帽子有几种状态:①未被掀开 ②被掀开但无硬币 ③被掀开且有硬币

所以,由于帽子数最大只有 \(13\),那么可以考虑用三进制存储下所有的状态并 DP 转移即可。

转移:

  • 边界条件 \(1\):如果硬币全部放置完,则只需要判断最后的摆放是否合法即可。
  • 边界条件 \(2\):如果选择次数全部使用完,则只需要判断是否存在 \(1\) 种方案放置剩余的硬币使得情况合法。
  • 非边界转移:\(f_{mask}=\max(f_{mask},\min(f_{mask|i_1},f_{mask|i_2}+1))\)。这里 \(i_1\) 指第 \(i\) 个帽子被掀开但无硬币,\(i_2\) 指被掀开且有硬币。由于魔法师希望值尽可能小,所以取 \(\min\)。但是你希望尽可能取大,所以外面取 \(\max\)。

Code

#include <bits/stdc++.h>
#define fi first
#define se second

using namespace std;

typedef pair<int, int> PII;
typedef long long LL;

const int N = 2e6 + 10;

int n, m, tot;
PII pos[14];
int f[N];
class MagicalHats {
public:
	int dp(int st, int cnt, int k) {
		if (f[st] != -1) return f[st];
		if (!k) {
			std::vector<int> lin(n, 0), col(m, 0);
			for (int i = 0; i < tot; i ++)
				if ((st / (int)pow(3, i)) % 3 == 2) lin[pos[i].fi] += 2, col[pos[i].se] += 2;
				else lin[pos[i].fi] ++, col[pos[i].se] ++;
			for (int i = 0; i < n; i ++) if (lin[i] & 1) return f[st] = 2e9;
			for (int i = 0; i < m; i ++) if (col[i] & 1) return f[st] = 2e9;
			return 0;
		}
		if (!cnt) {
			for (int i = 0; i < tot; i ++)
				if ((st / (int)pow(3, i)) % 3 == 0 && dp(st + 2 * pow(3, i), 0, k - 1) == 0)
					return f[st] = 0;
			return f[st] = 2e9;
		}
		int res = 0;
		for (int i = 0; i < tot; i ++)
			if ((st / (int)pow(3, i)) % 3 == 0)
				res = max(res, min(dp(st + pow(3, i), cnt - 1, k), dp(st + 2 * pow(3, i), cnt - 1, k - 1) + 1));
		return f[st] = res;
	}
	int findMaximumReward(vector<string> g, vector<int> w, int turn) {
		memset(f, -1, sizeof f);
		n = g.size(), m = g[0].size();
		for (int i = 0; i < n; i ++)
			for (int j = 0; j < m; j ++)
				if (g[i][j] == 'H')
					pos[tot ++ ] = {i, j};
		int res = dp(0, turn, w.size()), ans = 0;
		if (res > w.size()) return -1;
		sort(w.begin(), w.end());
		for (int i = 0; i < res; i ++)
			ans += w[i];
		return ans;
	}
};

标签:return,硬币,int,res,精讲,st,++,MagicalHats,清新
From: https://www.cnblogs.com/Tiny-konnyaku/p/18220991

相关文章

  • 「清新题精讲」CheckerExpansion
    SRM550-500CheckerExpansionDescription起初\((0,0)\)点Alice填为了红色,接下来\(t\)次操作Alice和Bob轮流操作,如果\((x-1,y-1)\)位置被另一方填了且\((x-2,y)\)为空;或\((x-1,y-1)\)为空且\((x-2,y)\)被另一方填了,则当前方将填\((x,y)\)。给定\(x,y,h,w......
  • 「清新题精讲」Skiers
    SkiersDescription给定\(n\)个点的有向无环平面图,求最少多少条从\(1\)到\(n\)的路径能覆盖原图的所有边?\(1\len\le5\times10^3\)Solution考虑从\(1\)到\(n\)的路径其实是边的链覆盖,那么最小链覆盖即为求解的答案。通过Dilworth定理可知,最小链覆盖等于最大反链,......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——高性能的 gRPC
    远程过程调用RPC——高性能的gRPC gRPC,这一由Google推出的高性能、开源、通用RPC框架,凭借其众多引人注目的特性,已成为业界瞩目的焦点。它基于HTTP/2协议标准设计开发,并采用ProtocolBuffers作为默认的数据序列化协议,广泛支持多种编程语言。gRPC不仅简化了服务的精确定义,而且......
  • Bash脚本语法解析(典例精讲)
    参考资料:https://github.com/AUTOMATIC1111/stable-diffusion-webuihttps://razeen.me/posts/the-ultimate-programmers-guide-to-bash-scripting/众所周知.sh文件是Linux系统中的脚本文件。(与之相对的还有windows系统上对应cmd的bat文件,对应powershell的ps1文......
  • BSP视频教程第30期:UDS ISO14229统一诊断服务CAN总线专题,常用诊断执行流程精讲,干货分享
    视频教程汇总帖:https://www.armbbs.cn/forum.php?mod=viewthread&tid=110519 【前言】1、继前面分享了CANopen和J1939的专题后,这次继续为大家分享UDS专题视频第1期。2、统一诊断服务(UnifiedDiagnosticServices,简称UDS)是车用电子的通信协议,是电子控制器ECU中设备诊断用的网......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——优化RPC调用,缓解频繁请求
    远程过程调用RPC——优化RPC调用,缓解频繁请求导致的GC压力 在Go语言的高并发和微服务架构中,远程过程调用(RPC)是一种常用的通信机制。然而,当频繁发送RPC请求时,不断创建Request和Response结构体可能会带来额外的垃圾收集(GC)压力,进而影响应用的性能和响应时间。为了减......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——客户端处理RPC请求的原理
    远程过程调用RPC——客户端处理RPC请求的原理及源代码分析 客户端无论是同步调用还是异步调用,每次RPC请求都会生成一个Call对象,并使用seq作为key保存在map中,服务端返回响应值时再根据响应值中的seq从map中取出Call,进行相应处理。 客户端发起RPC调用的过程大致如下所示,我们......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——服务端注册实现原理分析
    远程过程调用RPC——服务端注册实现原理分析rpcserver代码参考我前一篇博文:https://www.cnblogs.com/zuoyang/p/18146870RPCServer端的RPC代码架构主要由两大部分构成:第一部分是服务方法的注册过程。在这个过程中,我们首先通过调用rpc.Register接口将服......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC——实践案例:Go 语言 RPC 过程
    远程过程调用RPC——实践案例:Go语言RPC过程调用实践 Go语言的官方RPC库/net/rpc为开发者提供了实现远程过程调用的强大功能,使得通过网络访问对象的方法成为可能。这种机制极大地促进了分布式系统的构建,让不同的服务能够轻松地进行相互通信和协作。 在使用Go的RPC库时,服务......
  • Go语言高并发与微服务实战专题精讲——远程过程调用 RPC
    远程过程调用RPC 在微服务架构中,每个服务实例负责某一单一领域的业务实现,不同服务实例之间需要进行频繁的交互来共同实现业务。服务之间通过轻量级的远程调用方式进行通信。比如说RPC和HTTP。两者虽然同为微服务实例之间远程调用的方式,但是HTTP调用是应用层协议,而RPC的......