1. 程式人生 > 其它 >Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)

Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)

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;
}