1. 程式人生 > >【noip模擬賽3】賈老二的工件 (模擬)

【noip模擬賽3】賈老二的工件 (模擬)

con 數字 cout bit 最小 amp min www. tle

描述

賈老二有很多工件,最常見的工件都是長條形的,但其頂端是凹凸不平的,即不同位置的高度不同。現在賈老二有兩個最常見的工件,他想將它們完全放入另一種罕見的可容納高度不超過k的工件中,問該罕見的工件的最小長度。

輸入

輸入來自文件jia.in,包括三行。第一行包含一個不超過20的正整數k;接下來每行有一個長度不超過100的正整數串,其中的每個數都在1到9之間,表示該常見工件對應位置的高度。技術分享圖片

輸出

包括一個數字即罕見的工件的最小長度。如果無解則輸出“Impossible”。

輸入樣例 1

4
2213
231223

輸出樣例 1

7

輸入樣例 2

1
2112
122111

輸出樣例 2

Impossible



非常麻煩的模擬 註意:零件可以翻轉!!!
把a,b變成
2213 ---> 22130000000
231223 ---> 00002312230000

然後在a的左端加0 就右移了
第一次掃到不是0設置左坐標
掃到為0設置右坐標 (所以a的最右邊要多出一個0)

string的各種操作真的非常方便!!!
#include<bits/stdc++.h>
using namespace
std; //input #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s) #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 2050 #define
inf -0x3f3f3f3f int main() { int d; RI(d); string a,b; cin>>a>>b; string temp=a; int lena=a.size(); int lenb=b.size(); REP(i,lenb+1) a+="0";//給right留空位 REP(i,lena) b="0"+b+"0"; int ans=INT_MAX; REP(i,lenb+lena) { int j=0; int left=inf,right=0; int flag=1; while(a[j]&&b[j]) { int k=a[j]-0+b[j]-0; if(k&&left==inf){left=j;right=inf;}//取左 if(!k&&right==inf){right=j;}//取右 if(k>d){flag=0;break;} j++; } if(flag)ans=min(ans,right-left); a="0"+a; } a=""; for(int i=0;i<temp.size();i++) a=temp[i]+a; REP(i,lenb+1) a+="0"; REP(i,lenb+lena) { int j=0;int left=inf,right=0; int flag=1; while(a[j]&&b[j])//當由乙方不存在時結束 { int k=a[j]-0+b[j]-0; if(k&&left==inf){left=j;right=inf;} if(!k&&right==inf){right=j;} if(k>d){flag=0;break;} j++; } if(flag)ans=min(ans,right-left); a="0"+a; } if(ans==INT_MAX)printf("Impossible"); else cout<<ans; }




【noip模擬賽3】賈老二的工件 (模擬)