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'

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

被折叠的 条评论
为什么被折叠?



