【模拟】贾老二的工件 jia.pas/c/cpp
贾老二的工件
jia.pas/c/cpp
【题目描述】
Mr.L很多工件,最常见的工件都是长条形的,但其顶端是凹凸不平的,即不同位置的高度不同。现在Mr.L有两个最常见的工件,他想将它们完全放入另一种罕见的可容纳高度不超过k的工件中,问该罕见的工件的最小长度。
【输入格式】
输入来自文件jia.in,包括三行。第一行包含一个不超过20的正整数k;接下来每行有一个长度不超过100的正整数串,其中的每个数都在1到9之间,表示该常见工件对应位置的高度。
【输出格式】
输出到文件jia.out,包括一个数字即罕见的工件的最小长度。如果无解则输出“Impossible”。
【样例输入1】
4
2213
231223
【样例输出1】
7
【样例输入2】
1
2112
122111
【样例输出2】
Impossible
这一题模拟一次即可
至于扫描可以按如下图所示,固定第二个工件不动,把第一个工件从左到右移动
,这种可以用指针维护
当然,我用了一种简单的方法处理他们,把它们读成字符串a,b,在b前面加入a.length()那么多个'0',在b后面加上a.length()那么多个'0',在a后面加上b.length()个'0',下面拿样例1来说明
2213 ---> 2213000000
231223 ---> 00002312230000
那么每一次从区间[l,r]扫描一次,a[i]-'0'+b[i]-'0' 就是工件当前位置的高,一次扫描完了后,要移动上面的位置,只需要把上面那个前面加上一个'0'即可 即a='0'+a,如下图所示
如果把上面都能弄对了,那就能的50分了
?没AC?还差一种情况,工件是可以翻转的!
那么只需要把 a 翻转一下(与翻转b是等同的),在重复上面的过程(Ctrl+C Ctrl+V或者写成模块)
完了就AC了
C++ Code
/* C++ Code http://oijzh.cnblogs.com */ #include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #include<string> using namespace std; #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) #define INF 0x7fffffff int k; string a,b; int lena,lenb; bool flag=false; int best=INF; void wrong() { printf("Impossible");exit(0); } int calc(int l,int r) { int sum; //printf("l=%d r=%d\n",l,r); for(int i=l;i<=r;i++) { sum=(a[i]-'0')+(b[i]-'0'); //printf("%d+%d=%d\n",(a[i]-'0'),(b[i]-'0'),sum); if(sum>k)return -1; } return r-l+1; } void work() { int cc; for(int i=0;i<lena+lenb;i++) { //cout<<a<<endl<<b<<endl; cc=calc(min(i,lena),max(i+lena-1,lena+lenb-1)); if(cc!=-1)flag=true; if(cc>0)best=min(best,cc); a='0'+a; //printf("\n"); } } int main() { freopen("jia.in","r",stdin); freopen("jia.out","w",stdout); scanf("%d",&k); getline(cin,a);//跳行 getline(cin,a); string s=a; for(int i=0;i<a.length();i++) if(a[i]>k+'0') wrong(); getline(cin,b); for(int i=0;i<b.length();i++) if(b[i]>k+'0') wrong(); lena=a.length();lenb=b.length(); for(int i=1;i<=lena;i++) b='0'+b; for(int i=1;i<=lena;i++) b=b+'0'; for(int i=1;i<=lenb;i++) a=a+'0'; work(); a=""; for(int i=0;i<s.length();i++)a=s[i]+a; for(int i=0;i<a.length();i++) if(a[i]>k+'0') wrong(); work(); if(flag)printf("%d",best); else wrong(); return 0; }