题解 | #Kevin的宝石#

Kevin的宝石

https://ac.nowcoder.com/acm/contest/70845/E

和题解的DP方法不一样,,代表前i个宝石考虑完了之后剩下j块钱的最大价值

考虑对于普通宝石 =

然后考虑魔法宝石对于每种魔法宝石,可以考虑与前面的魔法宝石发生碰撞位置L和位置R的魔法宝石发生碰撞情况只有这个区间内的魔法宝石数量是偶数,且L和R都是魔法宝石,那么就可以从内到外的不断碰撞,直到最后L和R位置的宝石发生碰撞,区间能发生碰撞的话,能够获得的权值也是固定的,就是区间内普通宝石的权值,区间能发生碰撞的话,所消耗的钱也是固定的,就是区间内魔法宝石的权值。 区间内普通宝石的权值前缀和,区间内魔法宝石的权值前缀和 在位置R是魔法宝石时的转移为,满足上述要求, 这就是转移式子,后面是分析偶数个魔法宝石的问题,设置一个前缀和记录一下现在是奇数个魔法宝石还是偶数个魔法宝石,如果有偶数个魔法宝石,有偶数个魔法宝石,那么就有偶数个。如果有奇数个魔法宝石,有奇数个魔法宝石,那么就有偶数个。 借助两个map用来分奇偶就可以完成转移。 复杂就是多了一个log

int N, K;
bool OP[max_];
ll sum[3][max_];
struct {
	int op, val;
}node[max_];
map<ll, ll>mp[2];
ll f[max_];
void clear() { mp[0].clear(); mp[1].clear(); }
void solve() {
	int i, j;
	N = read(); K = read();
	for (i = 1; i <= N; i++) {
		node[i].op = read();
		node[i].val = read();
		if (node[i].op == 1) {
			sum[1][i] = sum[1][i - 1] + (ll)node[i].val;
			sum[2][i] = sum[2][i - 1];
		}
		else {
			sum[2][i] = sum[2][i - 1] + (ll)node[i].val;
			sum[1][i] = sum[1][i - 1];
		}
		OP[i] = OP[i - 1] ^ (node[i].op == 2);
	}
	if (node[1].op == 2)
		mp[0][K] = 0;
	for (j = 0; j <= K; j++)f[j] = -INF;
	f[K] = 0;
	int t1, ans = 0;;
	for (i = 1; i <= N; i++) {
		if (node[i].op == 2)
			for (j = 0; j <= K; j++) {
				if (mp[OP[i]].find(j + sum[2][i]) != mp[OP[i]].end()) {
					f[j] = max(f[j], mp[OP[i]][j + sum[2][i]] + sum[1][i]);
				}
				ans = max(ans, f[j]);
			}
		if (node[i + 1].op == 2)
			for (j = 0; j <= K; j++) {
				if (f[j] == -INF)continue;
				if (mp[OP[i]].find(j + sum[2][i]) != mp[OP[i]].end()) {
					t1 = mp[OP[i]][j + sum[2][i]];
					mp[OP[i]][j + sum[2][i]] = max(t1, f[j] - sum[1][i]);
				}
				else mp[OP[i]][j + sum[2][i]] = f[j] - sum[1][i];
			}
	}
	printf("%lld\n", ans);
}
全部评论

相关推荐

03-26 08:58
已编辑
门头沟学院 Java
ttl:&nbsp;3.19一面晚上过3.20二面3.23oc3.25offerbase:末9有一段中小厂实习一面面经:(总体时长一个小时二十分钟左右没什么八股,主要都是问项目和场景题1.实习(问了有四十分钟,感觉面试官很看重实习这一块,一直在拷打,问到后面我都要疯了,好在准备得比较充分1️⃣用的是什么中间件,有参与技术选型吗,实习的项目里为什么选这个RabbitMQ而不是kafka,为什么不用RocketMQ,为什么放弃异步,自己的项目里面使用的是kafka,那你觉得项目和实习的中间件选型有差异的原因是什么,他们之间的区别在哪里,底层的原因知道吗(高柱到这里已经快疯了,但是硬着头皮答完了,主要是从一致性吞吐量和框架的契合度答,面试官说答得挺好的,应该是没什么问题,这一块就问了快半个小时,到这里我已经快疯了2️⃣项目怎么对接上下游3️⃣介绍项目的难点重点4️⃣微服务(高柱实习是单体项目没涉及这一块5️⃣Redis的使用2.项目:1️⃣智能客服是怎么应用在项目里的(langchain4j➕rag➕functioncalling)2️⃣RAG了解多少3️⃣文本向量化的难点是什么,了解哪些大模型的知识(我一点不懂,纯瞎扯,但貌似扯对了4️⃣对ai的态度是什么,aicoding相关5️⃣怎么保证多节点下Caffeine缓存里面数据都是一致的(答的是短ttl,面试官不是很满意,但是我确实不太懂这个怎么保证,后来查了还是不懂怎么保证6️⃣Redis的使用,和你的实习项目的使用有区别吗,还有一些引申问题3.八股(含量不高,就是走个过场1️⃣进程的内存布局2️⃣Redis三剑客3️⃣微服务相关知识(高柱已经忘得差不多了…勉强答上来4️⃣JVM5️⃣线程状态6️⃣线程安全,在你的实习项目里怎么保证线程安全的(又绕回来了4.智商题找异常球5.手撕:1️⃣五道sql,不难2️⃣力扣不重叠的滑动窗口数组,贪心➕双指针秒了强度拉满了这个一面,高柱到后面人都是傻的二面面经:(就半个小时实习拷打,简历上写了几点就问了几点,问完就结束了,无手撕
查看19道真题和解析
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务