1. 程式人生 > >Codeforces Round #451 (Div. 2) F Restoring the Expression

Codeforces Round #451 (Div. 2) F Restoring the Expression

rest strlen int() 開頭 都是 ret 代碼 += code

題意:

有一個a+b=c的等式,去掉兩個符號,把三個數連在一起得到一個數

給出這個數,要求還原等式,length <= 1e6

三個數不能含有前導0,保證有解

解法:

鐵頭過題法,分類然後各種判斷

我分了5種情況

0.開頭字符為0, 那麽結果一定是0+a=a的形式

然後4種情況

1.len(a) >= len(b) 且 len(c) == len(a)

2.len(a) <= len(b) 且 len(c) == len(b)

3.len(a) >= len(b) 且 len(c) == len(a) + 1

4.len(a) <= len(b) 且 len(c) == len(b) + 1

前兩種(沒有進位)判斷的情況:

(1)三個數如果長度不為1,那麽最高位不能為0

(2)len(a) != len(b) 時, 若max(a, b)的最高位為x,

 則c的最高位,應該為x或者x+1

(3)滿足上面兩種情況,開始檢驗a+b的每一位與c的每一位是否相等

後兩種(有進位)判斷的情況:

(1)三個數如果長度不為1,那麽最高位不能為0

(2)c的最高位必須是1

(3)滿足上面兩種情況,開始檢驗a+b的每一位與c的每一位是否相等

時間復雜度未知,但是實際運行效果,時空復雜度都是超贊的!

(整理了一下代碼似乎精簡過度影響了可讀性了...)

技術分享圖片
 1 #include <stdio.h>
 2
#include <string.h> 3 4 int n; 5 6 char s[1000010]; 7 8 int i, j, k, p, l, r; 9 10 int print() { 11 int i = 1; 12 for (; i <= l; i ++) 13 putchar(s[i]); 14 putchar(+); 15 for (; i <= r; i ++) 16 putchar(s[i]); 17 putchar(=); 18 for (; i <= n; i ++)
19 putchar(s[i]); 20 return 1; 21 } 22 23 int check(int s1, int s2) { 24 for (int i = s1, j = s2, k = n, t = 0; k > s2; k --) { 25 if ((s[i] + s[j] + t - 96) % 10 != s[k] - 48) 26 return 0; 27 t = (s[i] + s[j] + t - 96) / 10; 28 i --, j --; 29 if (i <= 0) i = 0; 30 if (j <= s1) j = 0; 31 } 32 return 1; 33 } 34 35 int judge() { 36 if (j != 1 && (s[l + 1] == 0 || s[r + 1] == 0)) return 0; 37 if (p) {if (s[r + 1] != k) return 0;} 38 else if (i != j && (k != s[r + 1] && k + 1 != s[r + 1])) return 0; 39 if (!check(l, r)) return 0; 40 return print(); 41 } 42 43 int main() { 44 scanf("%s", s + 1); 45 n = strlen(s + 1); 46 s[0] = 0; 47 48 l = 1, r = n - n / 2; 49 if (s[1] == 0) { 50 print(); 51 return 0; 52 } 53 54 for (i = 1 + (n & 1 ? 0 : 1), j = (n - i) / 2, r = n - j; i <= n / 3; i += 2, j --, r ++) { 55 k = s[1], l = j; 56 if (judge()) return 0; 57 k = s[l + 1], l = i; 58 if (judge()) return 0; 59 } 60 61 p = 1, k = 49; 62 for (i = 1 + (n & 1 ? 1 : 0), j = (n - i) / 2, r = n - j - 1; i <= n / 3 - (n % 3 == 0); i += 2, j --, r ++) { 63 l = j; 64 if (judge()) return 0; 65 l = i; 66 if (judge()) return 0; 67 } 68 }
View Code

Codeforces Round #451 (Div. 2) F Restoring the Expression