UVa 1588 Kickdown
题意:给出两个长度分别为n1,n2且每列高度只为1,或者2的长条,需要将它们放入一个高度为3的容器,问容器的最短长度。
分别以s,为标准,平移,得出一个长度l1,
再以t为标准,得出一个长度l2,
取len=min(len1,len2),再取len=max(max(n1,n2),len)(因为还是要覆盖住更长的那根长条)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack> 6 #include<vector> 7 #include<map> 8 #include<queue> 9 #include<algorithm> 10 #define mod=1e9+7; 11 using namespace std; 12 13 typedef long long LL; 14 const int maxn=10005; 15 char s[maxn],t[maxn]; 16 17 int main(){ 18 int i,j,ans,len1,len2,len,flag,tt; 19 while(cin>>s>>t){ 20 len1=strlen(s); 21 len2=strlen(t); 22 len=max(len1,len2); 23 24 for(i=0;i<len1;i++) {//s动,t不动 25 for(j=0;j<len2;j++){ 26 int a=s[j+i]-'0'; 27 int b=t[j]-'0'; 28 if(a+b>3) break; 29 } 30 31 if(j==len2) break; 32 } 33 34 int x=len2+i; 35 36 for(i=0;i<len2;i++) {//t动,s不动 37 for(j=0;j<len1;j++){ 38 int a=s[j]-'0'; 39 int b=t[j+i]-'0'; 40 if(a+b>3) break; 41 } 42 43 if(j==len1) break; 44 } 45 int y=len1+i; 46 47 len=max(len,min(x,y)); 48 printf("%d\n",len); 49 50 memset(s,0,sizeof(s)); 51 memset(t,0,sizeof(t)); 52 } 53 return 0; 54 }
自己做错的原因是:只考虑到以一个为标准,另一个来移动,少考虑了一种情况