UVa 12545 - Bits Equalizer

链接:

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3990

 

题意:

输入两个等长(长度不超过100)的串S和T,其中S包含字符0, 1, ?,但T只包含0和1。
你的任务是用尽量少的步数把S变成T。每步有3种操作:把S中的0变成1;把S中的“?”变成0或者1;
交换S中任意两个字符。如果S不能变为T则输出-1。

 

分析:

既然S中的0可以变为1,'?'可以变为0或1,那么S不能变为T的唯一情况是S中1的个数比T多。
可以把解题过程分为几个阶段:
阶段一:分别统计S和T中1的个数,判断是否有解。
阶段二:如果S中某个位置是'?'且T中对应的位置是1,S中1的个数又比T少,则先把该位置变为1,以减少交换次数。
阶段三:将S中剩余的'?'变为0或1,只要能让S和T中1的个数相等,可以随意变换。
阶段四:判断是否需要把S中的某些0变为1,以及需要交换的次数。

 

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 
 4 const int UP = 100 + 5;
 5 char s[UP], t[UP];
 6 
 7 int judge(){
 8     int sum = 0; //1的个数
 9     for(int i = 0; s[i]; i++) sum += (t[i]=='1'), sum -= (s[i]=='1');
10     if(sum < 0) return -1; //阶段一:判断是否有解
11 
12     int change = 0, remain = strlen(s); //变换的次数,对应位置不相等的总个数
13     for(int i = 0; s[i]; i++) if(s[i] == '?' && sum && t[i] == '1'){
14         s[i] = '1';
15         change++;
16         sum--;
17     } //阶段二:优先把S中的某些位置变成1
18 
19     for(int i = 0; s[i]; i++){ //阶段三:将S中剩余的'?'变为0或1
20         if(s[i] == '?'){
21             change++;
22             if(sum) s[i] = '1', sum--;
23             else s[i] = '0';
24             if(s[i] == t[i]) remain--;
25         }
26         else if(s[i] == t[i]) remain--;
27     }
28     change += sum; //阶段四:把S中的某些0变为1,以及累加交换的次数
29     remain -= sum;
30     return change + remain / 2;
31 }
32 
33 int main(){
34     int T;
35     scanf("%d", &T);
36     for(int cases = 1; cases <= T; cases++){
37         scanf("%s%s", s, t);
38         printf("Case %d: %d\n", cases, judge());
39     }
40     return 0;
41 }

 

转载于:https://www.cnblogs.com/hkxy125/p/8324091.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值