UVA 1588 Kickdown & ACM/ICPC NEERC 2006 解题报告
2015-08-17 18:15
288 查看
题目大意
给两个长度分别为n1,n2(n1,n2<=100),且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,问能够容纳他们的最短容器长度。
![](http://img.blog.csdn.net/20150817181952589?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20150817182201492?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
题目地址:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51983
Sample Input & Sample Output
可以输入上述题目地址见详情(真的不是我懒)。
解题思路
这道题原题的description很长,而且还是英文的,但是翻译之后我们需要了解的也就是上面短短几十个字而已。所以新手朋友不要被英文吓到。
然后这道题我一开始思路也很简单,就是用两个for循环遍历一下,从左往右找出两根长条重合的部分,再用两根长条的和减去重合的部分,然后果然WA了。
于是我遇上了坑点一: 在sample input 的里面第一根长条的长度是大于等于第二根长条的长度的,必须考虑这个情况。
当然如果你在程序前面再加一个判断语句if的话,你会发现,你的程序还是WA。
这就是这道题的坑点二:
类似 12212 2221 这个input的话,你从左往右一个个判断的话,重合部分的0,得出的答案是9。 但是从右往左的话,重合部分是2,答案是7。
所以这道题最大的尿性就在于其检验数据按不同方向可以有两个不同答案,我们还要判断一下哪个更小,输出较小的那个答案才可以AC。
当然觉得以上废话太长的话就直接看下面的代码吧 _(:_」∠)_
给两个长度分别为n1,n2(n1,n2<=100),且每列高度只为1或2的长条。需要将它们放入一个高度为3的容器,问能够容纳他们的最短容器长度。
题目地址:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51983
Sample Input & Sample Output
可以输入上述题目地址见详情(真的不是我懒)。
解题思路
这道题原题的description很长,而且还是英文的,但是翻译之后我们需要了解的也就是上面短短几十个字而已。所以新手朋友不要被英文吓到。
然后这道题我一开始思路也很简单,就是用两个for循环遍历一下,从左往右找出两根长条重合的部分,再用两根长条的和减去重合的部分,然后果然WA了。
于是我遇上了坑点一: 在sample input 的里面第一根长条的长度是大于等于第二根长条的长度的,必须考虑这个情况。
当然如果你在程序前面再加一个判断语句if的话,你会发现,你的程序还是WA。
这就是这道题的坑点二:
类似 12212 2221 这个input的话,你从左往右一个个判断的话,重合部分的0,得出的答案是9。 但是从右往左的话,重合部分是2,答案是7。
所以这道题最大的尿性就在于其检验数据按不同方向可以有两个不同答案,我们还要判断一下哪个更小,输出较小的那个答案才可以AC。
当然觉得以上废话太长的话就直接看下面的代码吧 _(:_」∠)_
#include<cstdio> #include<cstring> #include<iostream> using namespace std; char a[105],b[105]; int main(){ while(~scanf("%s",a)){ scanf("%s",b); int A=strlen(a); int B=strlen(b); int i=0,j=0; for(i=0;i<A;++i){ for(j=i;j<B+i&&j<A;++j){ if(((a[j]-'0')+(b[j-i]-'0'))>3)break; } if(j>=B+i||j>=A)break; } int k1,k2; if(i<A) k1=A+B-j+i; else k1=A+B; for(i=0;i<B;++i){ for(j=i;j<A+i&&j<B;++j){ if(((b[j]-'0')+(a[j-i]-'0'))>3)break; } if(j>=A+i||j>=B)break; } if(i<B) k2=A+B-j+i; else k2=A+B; int ans; ans=k1<k2?k1 :k2; cout<<ans<<endl; } return 0; }
相关文章推荐
- 最小代价生成树
- Jquery 使用记录
- ZOJ Team Formation 3870【位运算】
- Leetcode#59||Spiral Matrix II
- Chapter4: View - The Big Nerd Ranch Guide 读书笔记
- JMeter 参数设置 变量 url
- UVA 10160 Servicing Stations
- Windows下的calabash安装
- 归档和反归档以及文件管理
- 1137 计算系数
- Spring 通过AOP 来实现前置,环绕,异常通知,注解
- 人口红利已尽:iPhone 6S或迎销量大滑坡
- Mac上编译出现NSObjCRuntime.h unknown type name nsstring问题
- Mac 电脑添加代理服务器
- HDU 3062 Party (2-SAT模板题)
- ant exec task参数-c
- 数据库设计理论及应用(4)——概念结构设计
- Android应用更新介绍提醒框
- Agilefant安装
- AsyncTask在SDK 3.0前后的区别