CodeForces 625D Finals in arithmetic
神奇的构造题,我的思路比较奇葩。搞了好久,看到WA on 91我绝望了,然后自己造数据,找到了错误,总算是AC了,现在是凌晨0:24分,看到AC之后,感动China!
我写的代码无比的长。。。。。应该有很简单的方法吧。。。。。没想到。
#include <stdio.h> #include <algorithm> #include <string.h> #include <queue> #include <stack> #include <map> #include <vector> using namespace std; const int maxn = 100000 + 100; char s[maxn]; int a[maxn], b[maxn], sum[maxn], flag[maxn]; int tmpa[maxn], tmpb[maxn], ans[maxn]; int nb[maxn]; int len; void read() { scanf("%s", s); for (int i = 0; s[i]; i++) b[i + 1] = s[i] - '0'; nb[1] = b[1] * 10 + b[2]; for (int i = 2; s[i]; i++) nb[i] = s[i] - '0'; } void init() { len = strlen(s); memset(flag, 0, sizeof flag); } bool check1() { for (int i = 1; i <= (len + 1) / 2; i++) { if (sum[i] % 2 == 0) a[i] = sum[i] / 2, a[len - i + 1] = sum[i] / 2; else a[i] = sum[i] / 2 + 1, a[len - i + 1] = sum[i] - a[i]; } for (int i = 1; i <= len; i++) tmpa[i] = a[i]; for (int i = 1; i <= len; i++) tmpb[i] = a[len - i + 1]; int k = 0; for (int i = 1; i <= len; i++) { ans[i] = (tmpa[i] + tmpb[i] + k) % 10; k = (tmpa[i] + tmpb[i] + k) / 10; } for (int i = 1; i <= len; i++) if (b[len - i + 1] != ans[i]) return 0; return 1; } bool work1() { bool fail = 0; init(); for (int i = len; i >= len / 2 + 1; i--) { int id_now = i, id_pre = len - i + 1; if (i == len) { if (b[i] == 0) { fail = 1; break; } sum[id_now] = b[id_now]; sum[id_pre] = b[id_now]; flag[id_now] = 0; flag[id_pre] = 0; if (b[id_now] == b[id_pre]) flag[id_pre + 1] = 0; else if (b[id_now] + 1 == b[id_pre]) flag[id_pre + 1] = 1; else { fail = 1; break; } } else { int num_now, num_pre; num_now = b[id_now] - flag[id_now + 1]; if (num_now == 9) { if (b[id_pre] == 9) { sum[id_now] = 9; sum[id_pre] = 9; flag[id_pre + 1] = 0; } else if (b[id_pre] == 0) { sum[id_now] = 9; sum[id_pre] = 9; flag[id_pre + 1] = 1; } else { fail = 1; break; } } else if (b[id_now] == 0 && flag[id_now + 1]) { if (b[id_pre] == 9 || b[id_pre] == 0) { flag[id_now] = 1; if (b[id_pre] == 0) flag[id_pre + 1] = 1; sum[id_now] = 9; sum[id_pre] = 9; } else { fail = 1; break; } } else { num_now = num_now + flag[id_pre] * 10; num_pre = b[id_pre] + flag[id_pre] * 10; if (num_now == num_pre) { flag[id_pre + 1] = 0; sum[id_now] = num_now; sum[id_pre] = num_now; if (num_now >= 10) flag[id_now] = 1; } else if (num_now + 1 == num_pre) { flag[id_pre + 1] = 1; sum[id_now] = num_now; sum[id_pre] = num_now; if (num_now >= 10) flag[id_now] = 1; } else { fail = 1; break; } } } if (id_now == id_pre&&sum[id_pre] % 2 != 0) { fail = 1; break; } } if (!check1()) fail = 1; return fail; } bool check2() { memset(tmpa, 0, sizeof tmpa); memset(tmpb, 0, sizeof tmpb); for (int i = 1; i <= (len + 1) / 2; i++) { if (sum[i] % 2 == 0) a[i] = sum[i] / 2, a[len - i + 1] = sum[i] / 2; else a[i] = sum[i] / 2 + 1, a[len - i + 1] = sum[i] - a[i]; } for (int i = 1; i <= len; i++) tmpa[i] = a[i]; for (int i = 1; i <= len; i++) tmpb[i] = a[len - i + 1]; int k = 0; len++; for (int i = 1; i <= len; i++) { ans[i] = (tmpa[i] + tmpb[i] + k) % 10; k = (tmpa[i] + tmpb[i] + k) / 10; } for (int i = 1; i <= len; i++) if (b[len - i + 1] != ans[i]) return 0; return 1; } bool work2() { bool fail = 0; init(); len--; for (int i = len; i >= len / 2 + 1; i--) { int id_now = i, id_pre = len - i + 1; if (i == len) { sum[id_now] = 10 + nb[id_now]; sum[id_pre] = 10 + nb[id_now]; flag[id_now] = 1; flag[id_pre] = 1; if (nb[id_now] + 10 == nb[id_pre]) flag[id_pre + 1] = 0; else if (nb[id_now] + 10 + 1 == nb[id_pre]) flag[id_pre + 1] = 1; else { fail = 1; break; } } else { int num_now, num_pre; num_now = nb[id_now] - flag[id_now + 1]; if (num_now == 9) { if (nb[id_pre] == 9) { sum[id_now] = 9; sum[id_pre] = 9; flag[id_pre + 1] = 0; } else if (nb[id_pre] == 0) { sum[id_now] = 9; sum[id_pre] = 9; flag[id_pre + 1] = 1; } else { fail = 1; break; } } else if (nb[id_now] == 0 && flag[id_now + 1]) { if (nb[id_pre] == 9 || nb[id_pre] == 0) { flag[id_now] = 1; if (nb[id_pre] == 0) flag[id_pre + 1] = 1; sum[id_now] = 9; sum[id_pre] = 9; } else { fail = 1; break; } } else { num_now = num_now + flag[id_pre] * 10; num_pre = nb[id_pre] + flag[id_pre] * 10; if (num_now == num_pre) { flag[id_pre + 1] = 0; sum[id_now] = num_now; sum[id_pre] = num_now; if (num_now >= 10) flag[id_now] = 1; } else if (num_now + 1 == num_pre) { flag[id_pre + 1] = 1; sum[id_now] = num_now; sum[id_pre] = num_now; if (num_now >= 10) flag[id_now] = 1; } else { fail = 1; break; } } } if (id_now == id_pre&&sum[id_pre] % 2 != 0) { fail = 1; break; } } if (!check2()) fail = 1; return fail; } int main() { read(); init(); if (!work1()) { for (int i = 1; i <= len; i++) printf("%d", a[i]); printf("\n"); } else { if (b[1] == 1) { if (!work2()) { for (int i = 1; i <= len - 1; i++) printf("%d", a[i]); printf("\n"); } else { printf("0\n"); } } else { printf("0\n"); } } return 0; }