UVa 1588 换抵挡装置
前言
大意是说,两个槽能够插在一起,并保证每一列的高度不高于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 换抵挡装置的更多相关文章
- 换抵挡装置 (Kickdown,ACM/ICPC NEERC 2006,UVa1588
题目描述:算法竞赛入门经典习题3-11 题目思路:1.两长条移动匹配 2.上下调换,取小者 #include <stdio.h> #include <string.h> int ...
- 算法习题---3.11换抵挡装置(UVa1588)
一:题目 给你连个长度分别为n1,n2且每列高度只为1或2的长条,然后将他们拼在一起,高度不能超过3,问他们拼在一起的最短长度 二:实现思路 1.获取主动轮和从动轮的数据. 2.主动轮不动,从动轮从左 ...
- 【每日一题】 UVA - 1588 Kickdown
题意:uva的题,每道都是有背景的orz,都是阅读理解 题解:暴力模拟,拿着短的那个串,对着长的一格一格往左滑,每滑一格暴力扫一遍.然后再从头往右滑,我这里wa了三发,wa了后习惯性瞎改,改到后来循环 ...
- Uva 1588 Kickdown
这道题思路并不难想,在做题过程中主要遇到的困难有: 因为没有仔细的考虑边界情况,没有分析全面,导致因=没有取到而得不出正确结果,浪费的大量时间. 今后在做这类题目时,一定要先进行一个比较全面的分析+模 ...
- 【习题 3-11 UVA - 1588】Kickdown
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟一下就好 一位一位地往右移动. [代码] #include <bits/stdc++.h> using namesp ...
- Kickdown UVA - 1588
A research laboratory of a world-leading automobile company has received an order to create a specia ...
- UVA 674 Coin Change 换硬币 经典dp入门题
题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数. 经典的dp题...可以递推也可以记忆化搜索... 我个人比较喜欢记忆化搜索,递推不是很熟练. 记忆化搜索:很白 ...
- uva 674 Coin Change 换钱币【完全背包】
题目链接:https://vjudge.net/contest/59424#problem/A 题目大意: 有5种硬币, 面值分别为1.5.10.25.50,现在给出金额,问可以用多少种方式组成该面值 ...
- Ants UVA - 1411(km板题竟然让我换了个板子)
题意: 给出n个白点和n个黑点的坐标,要求用n条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段 解析: 带入负的欧几里得距离求就好了 假设a1-b1 与 ...
随机推荐
- MyBatis 一对多关联查询
sqlxml文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC ...
- MVC伪一个12306图片验证码
本文的来由主要是满足自己的好奇心,而不是证明什么东西,如果涉及到什么官方性的事情,麻烦通知我谢谢:本篇将要和大家分享的是一个看起来通12306图片验证码相似的效果,这篇应该是今年农历最后一篇分享文章了 ...
- apache 运行php环境之困扰,无法加载多个不同的.html文件
又是一个项目,为多个纯静态html页面h5游戏页,原本是一个简单得不能的项目,但是却多生了事端. 我按照apache的惯例,将文件上传到服务器的DocumentRoot目录,进行测试了. 刚开始使用目 ...
- Redis系列三(redis配置文件分析)
在第一篇文章中有提到过redis.conf这个文件,这个文件就是redis-server的具体配置了.要使用好redis,一定要搞清楚redis的配置文件,这样才能最大的发挥redis的性能. # B ...
- (一)Lua脚本语言入门
今天开始自己的Lua语言学习,Lua脚本语言,是介于应用程序和开发其应用程序的底层编程语言之间,,它很方便调用其它语言,它只是在载入时对其进行编译,而不像我们写的单片机程序是预编译的,先编译好然后写入 ...
- java_JDBC(3)
Batch和Fetch两个特性非常重要.Batch相当于JDBC的写缓冲,Fetch相当于读缓冲 如果把JDBC类比为JAVA IO的话,不使用Fetch和Batch相当于直接使用FileInputS ...
- JAVA文件名命名规范
JAVA语言,有严格的大小写区分要示. JAVA源文件名必须符合以下规则: 1.必须以.java结尾.这样才能被编辑器javac.exe所编辑. 2.源文件中如果只有一个类,文件名必须与该类名相同. ...
- PHP标准库(SPL)- SplDoublyLinkedList类(双向链表)
class SplDoublyLinkedList implements Iterator, Traversable, Countable, ArrayAccess { const IT_MODE_L ...
- C++ 头文件系列 (bitset)
简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...
- cocos2dx截整屏、截部分屏
我的环境是cocos2dx 2.x的版本 [CCRenderTexture] CCRenderTexture这个动态纹理类,顾名思义就是可以动态创建纹理图片. 屏幕截图主要步骤: > 开始截图: ...