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 与 ...
随机推荐
- C/C++将一个整型数组拼接成一个字符串
参考: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #include <stdio.h> #include <string.h> int ma ...
- Flex 数据绑定
Flex 数据绑定 <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:f ...
- [心得]传统IT转互联网面试经验分享
http://www.newsmth.net/bbstcon.php?board=Java&gid=374779 传统IT外企干了8年,两年前转互联网的,面的和被面的都不少.这几天项目空档期, ...
- Charlse 使用小记
抓包神器Fiddler 是基于微软的 .Net 技术开发的,没办法直接在 Mac/Linux 下使用,而Charlse是Mac下常用的网络封包截取工具.是一个HTTP代理服务器,HTTP监视器,反转代 ...
- 自动化测试框架中关于selenium api的二次封装
不多说,直接看代码如下: #coding:utf-8 from selenium import webdriver from selenium.webdriver.common.action_chai ...
- C++ 头文件系列(unordered_map、unordered_set)
简介 很明显,这两个头文件分别是map.set头文件对应的unordered版本. 所以它们有一个重要的性质就是: 乱序 如何乱序 这个unorder暗示着,这两个头文件中类的底层实现----Hash ...
- 性能优化之数据存储&DOM编程
多读书多看报 数据存储 ·在javascript中,数据存储的位置会对代码整体性能产生重大的影响. ·数据存储共有4种方式:字面量.变量.数组.对象成员. ·要理解变量的访问速度,就要理解作用域. ...
- MVC,MVP,MVVM
MVC模式: MVC即Model-VIew-Controller.他是1970年代被引入到软件设计大众的.MVC模式致力于关注点的切分,这意味着model和controller的逻辑是不与用户界面(V ...
- shiyandaima
//jidaxiangronglei #include<iostream> #include<iostream> #include<iomanip> #includ ...
- atan()与atan2()
Atan2 函数介绍 atan2原型:extern float atan2(float y, float x);用法:#include <math.h>功能:求y/x(弧度表示)的反正切值 ...