URAL1495. One-two, One-two 2(dp)
牵扯一点数位 保存数的时候我是按2进制保存的 把1当作0算 把2当作1算 滚动数组
dp[i][j][(g*10+j)%n] = min(dp[i][j][(g*10+j)%n],dp[i-1][1][g]*2+j-1,dp[i-1][2][g]*2+j-1) j取1,2 *2+j-1是因为我按二进制算的
时限给出的2S就是给我这种毫无优化又笨又戳的代码的 跑了1.39s
0xfffffff的范围 是2Y多 还是少用好了 太容易超了
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<stdlib.h> 6 #include<vector> 7 using namespace std; 8 #define N 1000010 9 #define INF 1e9 10 #define LL long long 11 LL dp[2][3][N]; 12 int o[33]; 13 int main() 14 { 15 int i,j,n,g,y; 16 LL x = INF; 17 cin>>n; 18 if(n==1||n==2) 19 { 20 cout<<n<<endl; 21 return 0; 22 } 23 int flag = 0; 24 for(i = 1 ; i <= 2 ; i++) 25 for(j = 0 ; j < n ; j++) 26 dp[0][i][j] = dp[1][i][j] = INF; 27 for(i = 1; i <= 2 ; i++) 28 dp[1][i][i%n] = i-1; 29 for(i = 2; i <= 30 ; i++) 30 { 31 for(j = 1; j <= 2 ; j++) 32 { 33 for(g = 0 ; g < n ; g++) 34 { 35 if(dp[(i-1)%2][1][g]!=INF) 36 dp[i%2][j][(g*10+j)%n] = min(dp[i%2][j][(g*10+j)%n],dp[(i-1)%2][1][g]*2+j-1); 37 if(dp[(i-1)%2][2][g]!=INF) 38 dp[i%2][j][(g*10+j)%n] = min(dp[i%2][j][(g*10+j)%n],dp[(i-1)%2][2][g]*2+j-1); 39 if((g*10+j)%n==0&&dp[i%2][j][0]!=INF) 40 { 41 flag = 1; 42 if(x>dp[i%2][j][0]) 43 { 44 x = min(x,dp[i%2][j][0]); 45 y = i; 46 } 47 } 48 } 49 } 50 if(flag) break; 51 } 52 if(!flag) 53 puts("Impossible"); 54 else 55 { 56 g = 0; 57 while(x) 58 { 59 o[++g] = x%2+1; 60 x/=2; 61 } 62 for(i = 1 ; i <= y-g ; i++) 63 cout<<"1"; 64 for(i = g;i >= 1; i--) 65 cout<<o[i]; 66 } 67 return 0; 68 }