UVa 12545 Bits Equalizer【贪心】
2024-09-05 10:44:33
题意:给出两个等长的字符串,0可以变成1,?可以变成0和1,可以任意交换s中任意两个字符的位置,问从s变成t至少需要多少次操作
先可以画个草图
发现需要考虑的就是
1---0
0---1
?---0
?---1
下面三种都是只需要一次操作就可以完成的,
所以应该优先考虑1---0
如果存在0---1,就优先交换1---0和0---1,因为这样可以同时满足两组
如果不存在0---1,就交换1---0与?---1,这样每交换一次,需要两次操作,即先将问号变成0,再交换
如果最后都还剩下有1--0(因为下面的0是动不了的,无法再配对了),说明上面的1找不到与它配对的了,不存在
自己写的挫爆了(而且还是错的----)---网上看了好几篇题解的贪心也好繁琐
学习的这一篇 http://acm.lilingfei.com/uva-12545-bits-equalizer-%E4%B9%A0%E9%A2%988-3_98
好棒o(≧v≦)o~~
#include<iostream>
#include<cstdio>
#include<cstring>
#include <cmath>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<algorithm>
using namespace std; typedef long long LL;
const int INF = (<<)-;
const int mod=;
const int maxn=; char s[maxn];
char t[maxn]; int main(){
int T;
scanf("%d",&T);
int kase=;
while(T--){
cin>>s;
cin>>t; int len=strlen(s);
int one_zero=,zero_one=,q_one=,q_zero=; for(int i=;i<len;i++){
if(s[i]==''&&t[i]=='') one_zero++;
if(s[i]==''&&t[i]=='') zero_one++;
if(s[i]=='?'&&t[i]=='') q_one++;
if(s[i]=='?'&&t[i]=='') q_zero++;
} int ans=;
while(one_zero&&zero_one){
ans++;
one_zero--;
zero_one--;
}
while(one_zero&&q_one){
ans+=;
one_zero--;
q_one--; } if(one_zero) ans=-;
else ans+=zero_one+q_one+q_zero; printf("Case %d: %d\n",++kase,ans);
}
return ;
}
最新文章
- XML学习笔记(四)-- 修饰XML文档的CSS
- WebService站点服务的地址
- 【c++】标准模板库STL入门简介与常见用法
- 部门树形结构,使用Treeview控件显示部门
- eclipse启动不了,让查看.metadata/.log
- bzoj 1503: [NOI2004]郁闷的出纳员 Treap
- Android ListView SimpleAdapter支持Bitmap类型图片显示
- ios可变数组的所有操作
- Hybris商品图片导入与压缩有关的配置
- CSS2--字体样式
- 第二节: 比较EF的Lambda查询和Linq查询写法的区别
- JVM笔记(虚拟机各内存的介绍)
- ALGO-140_蓝桥杯_算法训练_P1101
- 企业计划体系的变迁:从ERP到APS再到SCP
- file not found app文件
- thunk函数
- 在js中做数字字符串补0
- 【zznu-夏季队内积分赛3-G】2333
- 冥冥中转到了mac 上进行开发
- jQuery remove 内存 释放