第三章:UVa1588 解题报告
来源:互联网 发布:dijkstra算法原理 编辑:程序博客网 时间:2024/06/03 20:54
UVa1588 解题报告
这道题可以直接模拟。因为齿轮是条状,高度只有两种,所以只要匹配字符串就可以了。两个字符串的相交区域计算高度相加是不是大于3,小于3便是合法的配对。处理A、B两个字符串时枚举B在总长中的起点和B的自身下标后进行匹配即可。以A的0下标为原点,B的0下标设为起点,这样B的起点从负数-B.length()开始,一直到A.length()+B.length(),然后B在A上左右滑动,寻找最小合法解。
预处理将A设置为最长的字符串,注意边界处理,即是A、B等长时。
以下是代码(可直接AC):
#include <iostream>#include <string>#include <cmath>using std::cin;using std::cout;using std::string;int main(){ string a,b; int min=999999; int in=0; while(cin>>a>>b) { int len1=a.length(),len2=b.length(); min=999999; in=0; if(len1<len2) { string tmp; tmp=a; a=b; b=tmp; len1=a.length(); len2=b.length(); } for(int i=-len2;i<len1+len2-1;i++)//枚举起点 { int ok=1;//是否合法的标记 for(int j=0;j<len2;j++) if(j+i>=0&&i+j<len1)//重叠区域才进行判断合法性 if(a[i+j]-'0'+b[j]-'0'>3) ok=0; if(ok&&i<0)//B在A左方 min=std::min(-i+len1,min); if(ok&&i>len1-len2)//B在A右方 min=std::min(len2+i,min); if(ok&&i>=0&&i+len2<=len1)//B与A完全重叠,合法就直接输出,不会有更小解 { in=1; break; } } if(in) cout<<len1<<'\n'; else cout<<min<<'\n'; } return 0;}
0 0
- 第三章:UVa1588 解题报告
- 第三章:UVa455 解题报告
- 第三章:UVa1225 解题报告
- 第三章:UVa1586 解题报告
- 第三章:UVa1585 解题报告
- 第三章:UVa227 解题报告
- 130730第三场多校解题报告
- 算法第三周解题报告
- Uva1588
- UVa1588
- ECNU第三届程序设计竞赛解题报告
- 第三部分:POJ 1000 解题报告
- 第三部分:POJ 1003 解题报告
- 第三部分:POJ 1005 解题报告
- 第三部分:POJ 1007 解题报告
- 第三部分:POJ 1006 解题报告
- (解题报告)入门经典2版———第三章习题1
- 华侨大学第三届程序设计大赛基础组决赛解题报告
- mysqli_query和mysql_query的一点区别
- 基线的定义
- JAVASCRIPT CLOSURE[译-进行中]
- java连接sql server时,错误“已生成用于更新的结果集”
- 创业16载上市N次,天涯上市还行么
- 第三章:UVa1588 解题报告
- 网页制作的几个小技巧
- 安全域的划分
- 自定义Seekbar样式
- 实现ARM-linux自动登录
- 【contentprovider系列2】查询联系人的信息
- MySQL锁表解决方法(转)
- XenServer网卡Bonding
- 面向对象之值传递和引用传递