前言

题目

大意是说,两个槽能够插在一起,并保证每一列的高度不高于3,保证最短长度。

思路

思路很简单,取短字符串遍历长字符串的每一个位置,纪录下位置,并取最短即可。

实现


//习题3-11 换抵挡装置
void caculate17() {
char n1[1000], n2[1000];
while (scanf("%s\n%s", n1, n2) != EOF) {
char *min_arr, *max_arr;
if (strlen(n1) < strlen(n2)) {
min_arr = n1;
max_arr = n2;
}
else {
min_arr = n2;
max_arr = n1;
} int minLen = (int)strlen(min_arr);
int maxLen = (int)strlen(max_arr); int min = minLen + maxLen;
// 从最长数字的左边开始对齐
for (int j = 0; j < maxLen; j++) {
int j_temp = j;
int result = 1;
for (int i = minLen-1; i >= 0 && j_temp >= 0; i--) {
int sum = (min_arr[i] - '0') + (max_arr[j_temp] - '0');
if (sum > 3) {
result = 0;
break;
} j_temp--;
} if (result) {
int temp = 0;
if (j >= strlen(min_arr)-1) {
temp = maxLen;
}
else {
temp = minLen + maxLen - (j + 1);
}
if (temp < min) {
min = temp;
}
}
} if (strlen(min_arr) != strlen(max_arr)) {
// 从最大数字的右边开始对齐
for (int j = maxLen - minLen; j < maxLen; j++) {
int j_temp = j;
int result = 1;
for (int i = 0; i < minLen && j_temp < maxLen; i++) {
int sum = (min_arr[i] - '0') + (max_arr[j_temp] - '0');
if (sum > 3) {
result = 0;
break;
} j_temp++;
} if (result) {
int temp = 0;
if (j == maxLen - minLen) {
temp = maxLen;
}
else {
temp = minLen + maxLen - (maxLen - j);
}
if (temp < min) {
min = temp;
}
}
}
} printf("%d\n", min);
}
} // 题目同上
void caculate18() {
char n1[1000], n2[1000];
while (scanf("%s\n%s", n1, n2) != EOF) {
char *min_arr, *max_arr;
if (strlen(n1) < strlen(n2)) {
min_arr = n1;
max_arr = n2;
} else {
min_arr = n2;
max_arr = n1;
} int maxLen = (int)strlen(max_arr);
int minLen = (int)strlen(min_arr); int min = maxLen + minLen;
int result = 0;
for (int i = -minLen; i < maxLen + minLen; i++) {
int ok = 1;
// 判断
for (int j = 0; j < minLen; j++) {
// 重合部分
if (i+j >= 0 && i+j < maxLen) {
if ((max_arr[i + j] - '0') + (min_arr[j] - '0') > 3) {
ok = 0;
break;
}
}
} // 短字符串在左边,部分重合
if (ok && i < 0) {
int temp = -i + maxLen; //-i代表左边的距离,移动距离则是重合部分
if (temp < min) {
min = temp;
}
} //短字符串在右边,部分重合
if (ok && i > maxLen - minLen) {
int temp = i + minLen; //这里的i则代表移动距离,没有包括重叠的部分
if (temp < min) {
min = temp;
}
} // 完全重合(最优解)
if (ok && i >= 0 && i + minLen <= maxLen) {
result = 1;
break;
}
} if (result) {
printf("%d\n", maxLen);
}
else {
printf("%d\n", min);
}
}
} // 大神思路,简单高效
void caculate19() {
char s1[128], s2[128];
while (scanf("%s\n%s", s1, s2) == 2) {
int max_len = strlen(s1), min_len = strlen(s2);
int ret = min_len + max_len; // 从左到右
for (int i = -min_len; i < max_len; i++) {
int ok = 1;
for (int j = 0; j < min_len && ok; j++) {
if (i + j >= 0 && i + j < max_len) {
ok &= s1[i+j] - '0' + s2[j] - '0' <= 3;
}
} if (ok) {
// 如果短字符串在左边或者重合的话,则为-i + max_len
// 如果短字符串在右边的话,则为i + min_len
ret = min(ret, max(max_len, i + min_len) - min(i, 0)); //太棒了!
}
} printf("%d\n", ret);
}
} int main() {
caculate18();
return 0;
}

呃,我的实现是第一种,没ac,应该是只过了部分的测试用例,但我不知道怎么改了~

UVa 1588 换抵挡装置的更多相关文章

  1. 换抵挡装置 (Kickdown,ACM/ICPC NEERC 2006,UVa1588

    题目描述:算法竞赛入门经典习题3-11 题目思路:1.两长条移动匹配 2.上下调换,取小者 #include <stdio.h> #include <string.h> int ...

  2. 算法习题---3.11换抵挡装置(UVa1588)

    一:题目 给你连个长度分别为n1,n2且每列高度只为1或2的长条,然后将他们拼在一起,高度不能超过3,问他们拼在一起的最短长度 二:实现思路 1.获取主动轮和从动轮的数据. 2.主动轮不动,从动轮从左 ...

  3. 【每日一题】 UVA - 1588 Kickdown

    题意:uva的题,每道都是有背景的orz,都是阅读理解 题解:暴力模拟,拿着短的那个串,对着长的一格一格往左滑,每滑一格暴力扫一遍.然后再从头往右滑,我这里wa了三发,wa了后习惯性瞎改,改到后来循环 ...

  4. Uva 1588 Kickdown

    这道题思路并不难想,在做题过程中主要遇到的困难有: 因为没有仔细的考虑边界情况,没有分析全面,导致因=没有取到而得不出正确结果,浪费的大量时间. 今后在做这类题目时,一定要先进行一个比较全面的分析+模 ...

  5. 【习题 3-11 UVA - 1588】Kickdown

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟一下就好 一位一位地往右移动. [代码] #include <bits/stdc++.h> using namesp ...

  6. Kickdown UVA - 1588

    A research laboratory of a world-leading automobile company has received an order to create a specia ...

  7. UVA 674 Coin Change 换硬币 经典dp入门题

    题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数. 经典的dp题...可以递推也可以记忆化搜索... 我个人比较喜欢记忆化搜索,递推不是很熟练. 记忆化搜索:很白 ...

  8. uva 674 Coin Change 换钱币【完全背包】

    题目链接:https://vjudge.net/contest/59424#problem/A 题目大意: 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值 ...

  9. Ants UVA - 1411(km板题竟然让我换了个板子)

    题意: 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段 解析: 带入负的欧几里得距离求就好了 假设a1-b1 与 ...

随机推荐

  1. Objective-C处理动态类型函数集

    -(BOOL) isKindOfClass:class-object 对象是不是class-object或其子类的实例-(BOOL) isMemberOfClass:class-object 对象是不 ...

  2. 实现jul 日志重定向到 slf4j

    需求背景 jul 指的是java.util.logging,是 java 内置的日志模块,目前流行的Java日志组件还包括 jcl(common-logging).slf4j/log4j/logbac ...

  3. windows下Visual Studio Code 1.9安装

    点击送你去官网下载vs code 进入下载页面如下 下载完成双击安装 安装完成打开之后如下图,最新版的默认中文就挺好的! 注意下面是微软建议: Note: .NET Framework 4.5.2 i ...

  4. css3 3d变换和动画——回顾

    1.transform-style 属性指定嵌套原始是怎样在三维空间中呈现. 语法:transform-style: flat | preserve-3d flat 表示所有子元素在2D平面呈现. p ...

  5. 下一个项目为什么要用 SLF4J

    阿里巴巴 Java 开发手册 前几天阿里巴巴在云栖社区首次公开阿里官方Java代码规范标准,就是一个PDF手册,有命名规范,让你知道自己原来取的每一个类名.变量名都是烂名字,真替你家未来孩子担心:有集 ...

  6. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  7. javascript的方法

    1. decodeURIComponent() decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码. 语法: decodeURI ...

  8. asp.net core mvc剖析:mvc执行过程(一)

    前面介绍了路由的过程,我们再来看下MvcRouteHandler的代码: public Task RouteAsync(RouteContext context) { ...... //根据路由信息查 ...

  9. devexpress表格gridcontrol实现分组,并根据分组计算总计及平均值

    1.devexpress表格控件gridcontrol提供了强大的分组功能,你几乎不用写什么代码就可以实现一个分组功能,并且可根据分组计算总计和平均值.这里我例举了一个实现根据班级分组计算班级总人数, ...

  10. 在Eclipse上通过插件获取github上的spring源码

    spring源码开始的时候是通过SVN来管理代码的,后来是转移到github上管理源码的,可以通过在github上直接下载spring的源码. 下面讲解如何通过在eclipse上的插件git来获取sp ...