uva1588换低档装置Kickdown
来源:互联网 发布:机票怎么订最便宜 知乎 编辑:程序博客网 时间:2024/05/22 05:00
背景:wrong得我想哭,一上午和一晚上。错主要错在:<1>最先循环写成了死循环 <2>考虑问题不全面,少考虑了一个方面 <3>再写循环的时候循环终止条件错误
思路:第一段代码的思路是固定一个长的,让短的那根长条从最开始往后移,遇到吻合的话就输出,结束循环。
第二段代码的思路是先随便固定一个字符串,并把这个字符串进行延伸,延伸方法是在这个字符串的前面和后面都添加一些0,然后还是让另一跟木条在上面移动,遇到吻合的,就比较将小的数复制给答案,直到处理到最后面,输出最终答案。
总结:以后再写代码的时候,注意以上三点需要特别注意。
以下是最开始写出的代码,普通情况能够运行通过,但就是遇到特别坑的数据就通不过了,因为此代码少考虑了一种情况。比如说遇到数据121221212211212121112222211122和1212122121的时候就不可以正确输出了,因为这就是少考虑的那种情况,请读者按照数据自行考虑一下此代码少考虑了哪种情况。
#include <stdio.h>#include <string.h>void Search(int m,int n,char strip1[],char strip2[]){ int ans=0,temp=0; for(int k1=0;k1<=m;k1++) { int ok1=1,k=k1; for(int k2=0;k2<n&&k<m;k2++,k++) { int d=strip1[k]+strip2[k2]; if(d>('3'+48)&&ok1) {ok1=0;break;} } if(ok1) { if(n+k1<=m) {ans=m;break;} else {ans=n+k1;break;} } } printf("%d\n",ans);}int main(void){ char strip1[105],strip2[105]; memset(strip1,'A',sizeof(strip1)); memset(strip2,'A',sizeof(strip2)); while(scanf("%s %s",strip1,strip2)==2) { int m=strlen(strip1),n=strlen(strip2); if(m<n) Search(n,m,strip2,strip1); else Search(m,n,strip1,strip2); memset(strip1,'A',sizeof(strip1)); memset(strip2,'A',sizeof(strip2)); } return 0;}
上面代码少考虑了一种情况,请读者思考过后再来看补齐所缺的那种情况后的代码。
#include <stdio.h>#include <string.h>void Search(int m,int n,char strip1[],char strip2[]){ int ans=0,temp=0,ok=1; for(int k1=0;k1<=m;k1++) { int ok1=1,k=k1,ok2=1; for(int k2=0;k2<n&&k<m;k2++,k++) if((strip1[k]+strip2[k2])>('3'+48)) {ok1=0;break;} if(ok1) { if(n+k1<=m) {ans=m;break;} else {ans=n+k1;break;} } } for(int i=n-1;i>=0;i--) { ok=1,temp=i; for(int j=n-1;j>=n-1-i;j--,temp--) if((strip1[temp]+strip2[j])>=100) {ok=0;break;} if(ok) {ans=(ans>(m+n-i-1)?(m+n-i-1):ans);break;} } printf("%d\n",ans);}int main(void){ char strip1[105],strip2[105]; memset(strip1,'A',sizeof(strip1)); memset(strip2,'A',sizeof(strip2)); while(scanf("%s %s",strip1,strip2)==2) { int m=strlen(strip1),n=strlen(strip2); if(m<n) Search(n,m,strip2,strip1); else Search(m,n,strip1,strip2); memset(strip1,'A',sizeof(strip1)); memset(strip2,'A',sizeof(strip2)); } return 0;}
这里笔者提供另外一段代码,和上面的代码思路大同小异,但是是从一开始就把特殊情况考虑到的,但是下面的代码和上面的比较时间会用得多一些,但是本题数据较小,所以这点时间损失可以忽略不计。
#include <stdio.h>#include <string.h>int Max(int a,int b){return a>b?a:b;}int Min(int a,int b){return a<b?a:b;}void change(char *s1){ char s[305]={'0'}; int n=strlen(s1); for(int i=0;i<n;i++) s[i+1]=s1[i]; strcpy(s1,s);}int main(){ int i,j,ok,length; char s1[305],s2[305],t[305]; memset(s1,'A',sizeof(s1)); memset(s2,'A',sizeof(s2)); while(scanf("%s %s",s1,s2)==2) { int l1=strlen(s1),l2=strlen(s2),ans=l1+l2; memset(t,'0',sizeof(t)); for(int k=l1;k<l1+l2;k++) t[k]=s2[k-l1];t[l1+l2+l1]='\0';strcpy(s2,t); for(i=0;i<l1+l2;i++) {int n=l1; for(j=0;j<strlen(s1);j++) { ok=1; if(s1[j]+s2[j]-2*'0'>3) {ok=0;break;} } if(ok) { length=Max(l1+l2,l1+i)-Min(i,l1); if(length<ans) ans=length; } change(s1); } printf("%d\n",ans); memset(s1,'A',sizeof(s1)); memset(s2,'A',sizeof(s2)); } return 0;}
0 0
- uva1588换低档装置Kickdown
- 算法竞赛入门经典(第二版) 习题3-11 换低档装置(Kickdown) UVa1588 NEERC2006
- UVa 1588 Kickdown (换低档装置)
- UVa1588--Kickdown--换低挡装置
- 换低档装置(uva-1588)
- 习题3-11 换低档装置
- 题解:换低档装置(UVa 1588)
- UVA1588 - Kickdown
- uva1588 - Kickdown
- UVa1588 - Kickdown
- [uva1588]Kickdown
- Uva1588 Kickdown
- uva1588 Kickdown
- UVa1588-Kickdown
- 习题3-11 换抵挡装置 UVa1588
- Uva1588高低档
- UVa 1588 Kickdown(换抵挡装置)
- UVa1588——Kickdown
- Android 开发之为ActionBar 添加Actionbar Button
- PageAdmin不显示版权的3种方法
- node.js进程管理 PM2 && forever
- AngularJS语法
- AngularJS语法三
- uva1588换低档装置Kickdown
- Awesome Scala
- Backbone.js学习记录 Hello World!
- Backbone.js学习记录 使用集合
- 【零起步开发Cocos2dx-3.x-王牌飞行员(一)】为什么要开发cocos2d游戏
- CentOS 6.5下PHP 5.6编译安装
- NSArray 排序总结
- sqlite封装
- CentOS6.5下MySQL 5.6安装