CF小组训练赛 Holiday 30

本文分享了三道编程竞赛题目:XORwice的异或策略、Saving the City的最小引爆成本计算和Non-zero Segments的最小添加次数问题。解题思路涉及二进制分析、动态规划及前缀和技巧。最后一部分展示了Discrete Acceleration中复杂路径追踪的巧妙算法。

A. XORwice

小组训练赛,链接无法访问,具体题目地址可以直接搜索题目标题
题目大意

求(a xor x)+ (b xor x) 的最小值

解题思路

思维题。
以二进制考虑a,b:
当a=1,b=1时,为了取最小值0,当x=1时上述运算结果为0
当a=1,b=0时,无论x取何值,上述运算结果都为1
当a=0,b=0时,为了取最小值0,当x=0时上述运算结果为0
当a=0,b=1时,无论x取何值,上述运算结果都为1
所以,当a,b分别取不同值时,上述运算的最小值如下:
1,1–>0;
0,0–>0;
1,0–>1;
0,1–>1;
显然,最小值就是 a 异或 b

#include<bits/stdc++.h>
using namespace std;
int main(){
   
   
	int t;
	cin >> t;
	while(t--){
   
   
		int a,b;
		cin >> a >> b;
		cout << (a ^ b) << endl;
	}
	return 0;
}

B. Saving the City

小组训练赛,链接无法访问,具体题目地址可以直接搜索题目标题
题目大意

给一段01序列,1为有炸弹,0为无炸弹,目标是引爆所有炸弹。一个炸弹爆炸时可以触发前后相邻的两个的炸弹。可以在序列中没有炸弹的位置上放置炸弹,以使爆炸连续
引爆一个炸弹的钱是a,放一个炸弹的钱是b。问引爆所有炸弹的最小钱。

解题思路

首先,针对任意存在1的序列,必然至少需要一次引爆的钱。
在第一次引爆炸弹后,后续的炸弹要么被之前的爆炸触发引爆,要么作为下一次单独的爆炸起点……
比如序列:11100000111000111
针对第4个”1“,要么可以在前面放置5个炸弹,被第一次的爆炸引爆,要么作为第二次单独爆炸的起点。
由上,可以使用一个vector存储”1“的位置坐标,针对每一个”1“,判定是单独爆炸便宜,还是在前面放置 v[i]-v[i-1]-1个炸弹,从而被上一次爆炸引爆便宜。
即 min((v[i]-v[i-1]-1)*b,a)

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
typedef long long ll;

int main(){
   
   
	int t;
	cin >> t;
	while(t--){
   
   
		int a,b;
		cin >> a >> b;
		string s;
		cin >> s;
		int le = s.length();
		int i = 0;
		vector<int> v;
		while(i < le){
   
   
			if(s[i] == '1'
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值