Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)
阿新 • • 發佈:2021-08-30
A
顯然,不管怎麼加減,得到的 \(a, b\) 之差的奇偶性不變,所以如果 \(c - d \not\equiv 0 \pmod 2\),無解;如果 \(c = d = 0\),不用操作;否則,將 \(c, d\) 通過一次操作變成相等的數後同時減去這個數即可。
程式碼:
#include <stdio.h> int main(){ int t; scanf("%d", &t); for (int i = 1; i <= t; i++){ int c, d; scanf("%d %d", &c, &d); if ((c - d) % 2 != 0){ printf("-1\n"); } else if (c == 0 && d == 0){ printf("0\n"); } else { printf("%d\n", (c == d ? 0 : 1) + 1); } } return 0; }
B
顯然,如果奇數和偶數的出現次數之差的絕對值 \(> 1\),無解。
否則考慮奇數還是偶數當頭。
如果奇數的出現次數 \(\leq\) 和偶數的出現次數,可以將其搞成偶奇偶奇……的數列,奇數的出現次數 \(\geq\) 和偶數的出現次數時與之基本相同。
取可能存在的情況的最小值即可。
程式碼:
#include <stdio.h> #include <stdlib.h> int a[100007]; inline int min(int a, int b){ return a < b ? a : b; } int main(){ int t; scanf("%d", &t); for (int i = 1; i <= t; i++){ int n, cnta = 0, cntb = 0; scanf("%d", &n); for (int j = 1; j <= n; j++){ scanf("%d", &a[j]); a[j] %= 2; if (a[j] == 0){ cnta++; } else { cntb++; } } if (abs(cnta - cntb) > 1){ printf("-1\n"); } else { int ansa = 0x7fffffff, ansb = 0x7fffffff; if (cnta <= cntb){ ansa = 0; for (int j = 1, k = 0; j <= n; j++){ if (a[j] == 1){ ansa += abs(k * 2 - j + 1); k++; } } } if (cnta >= cntb){ ansb = 0; for (int j = 1, k = 0; j <= n; j++){ if (a[j] == 0){ ansb += abs(k * 2 - j + 1); k++; } } } printf("%d\n", min(ansa, ansb)); } } return 0; }