前言

题目

大意是说,两个槽能够插在一起,并保证每一列的高度不高于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. HTTP协议缓存策略深入详解之ETAG妙用

    Etag是什么: Etag 是URL的Entity Tag,用于标示URL对象是否改变,区分不同语言和Session等等.具体内部含义是使服务器控制的,就像Cookie那样. HTTP协议规格说明定义 ...

  2. spring 里面的StringUtils,先放这儿,有时间研究吧

    /* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Vers ...

  3. 笔记:Ubuntu 上的Testlink 部署

    1.安装apache2 sudo apt-get install apache2 2. sudo /etc/init.d/apache2 restart 测试: Http:\localhost or ...

  4. 如何开发基于Dubbo RPC的分布式服务?

    什么是Dubbo? Dubbo能做什么? 在Crystal框架下,如何开发基于Dubbo RPC的服务? 在Crystal框架下,如何调用Dubbo RPC服务? 相关的文章 什么是Dubbo? Du ...

  5. js实现360度图片旋转

    ▓▓▓▓▓▓ 大致介绍 这次是一个简单的效果,就是思路的问题 效果: ▓▓▓▓▓▓ 思路 旋转的效果就是根据鼠标的的移动距离来显示不同的图片,形成视觉差,仿佛就是在正真的旋转 由于效果是根据鼠标的移动 ...

  6. com.atomikos.icatch.HeurHazardException: Heuristic Exception

    com.atomikos.icatch.HeurHazardException: Heuristic Exception: 删除Tomcat  bin文件夹下的spring.loglog4j.appe ...

  7. js详解之作用域-实例

    函数如下大家可以做做看 function aa(a,b,c){ function a(){} console.log(a); console.log(aa); console.log(argument ...

  8. .Net程序员学用Oracle系列(13):合并语句(MERGE)

    - 1.[**语法说明**](#segment1) - 1.1.[UPDATE 和 INSERT 可以只出现一个](#point11) - 1.2.[UPDATE 后面还可以再跟 WHERE](#po ...

  9. 使用php实现网站验证码功能【博主推荐】

             验证码是网站常用的一项安全措施,也是新人站长较难掌握的一项技能,这里我向大家介绍一简单有效的验证码实现方法. 开始之前 在正式开始之前我们需要打开php的gd2图形库支持(在php. ...

  10. java_JDBC(1)

    Java连接Oracle步骤: 1.注册加载驱动 驱动名:DRIVER="oracle.jdbc.driver.OracleDriver";Class.forName(" ...