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 与 ...
随机推荐
- HDU-1994-利息计算
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1994 水题 题目分析 就是两种储存方式,输出所得本金加利息 代码 #include<stdio. ...
- mysql数据库update时只更新部分数据方法
需求:更新url中最一个字符的'-1'改为'-5',前面的内容保持不变 url列的内容如下:http://h5game.ecs.cedarmg.com/a/captal/dispther.do?dev ...
- Java Web快速入门——全十讲
Java Web快速入门——全十讲 这是一次培训的讲义,就是我在给学生讲的过程中记录下来的,非常完整,原来发表在Blog上,我感觉这里的学生可能更需要. 内容比较长,你可以先收藏起来,慢慢看. 第一讲 ...
- VAST3.0规范
VAST3.0视频广告投放规范 Posted on 2014年2月15日 1.术语 随着视频广告行业的发展,某些术语已经得到了广泛的采用.以下定义该文档中与视频广告投放相关的一些术语: 广告荚(Ad ...
- netcat工具的使用
用途:网络管理工具. 可以读,写TCP或UDP 网络连接.简写为:nc 常见参数: -h 帮助信息 -l 坚挺模式 -n 指定IP地址 -p 指定端口号 -v 详细输出 1 客户端:很容易建立一个客 ...
- C# WINFORM ListView用法详解(转)
源代码下载位置: http://pan.baidu.com/s/1qXrLehe 一.ListView类 1.常用的基本属性: (1)FullRowSelect:设置是否行选择模式.(默认为false ...
- Eclipse插件手动安装
拷贝至eclipse安装目录/dropins/文件夹下面: 不建议直接拷贝到features/ 和plugins/ 里面:
- C# 汉字转拼音 将中文转换成拼音
//建立一个公共类,用于转换汉字 public class ChnToPh { //定义拼音区编码数组 private static int[] getValue = new int[] { -,-, ...
- node源码详解(六) —— 从server.listen 到事件循环
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource6 本博客同步在https://cnodejs.o ...
- Android开发系列之事件拦截机制
对于Android开发者来说理解事件传递机制的重要性,我想应该是不言而喻的.在一个Activity里面,我们经常会重写onTouchEvent事件,可是重写结束之后,对于是返回true还是返回fals ...