题目链接:http://codeforces.com/problemset/problem/353/A
题目意思:通俗地说,就是当上下两半的数的总和不完全是偶数时,通过上下调换某些骨牌来使这两半的数和变成偶数,统计并输出调换多少次;如果不行,则输出-1。
其实调换的次数最多只有1次,而实行调换的操作必须符合上下对应的数满足一奇一偶的条件,否则是白做的。如果调换一次之后,也不能使得上下两半的和都为偶数,那么就没必要继续判断了,直接输出“-1”。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 using namespace std; 5 6 const int N = 100 + 5; 7 int x[N], y[N]; 8 9 int main() 10 { 11 int n, i, sum1, sum2, flag; 12 while (scanf("%d", &n) != EOF) 13 { 14 // freopen("data.txt", "r", stdin); 15 sum1 = sum2 = 0; 16 for (i = 0; i < n; i++) 17 { 18 scanf("%d%d", &x[i], &y[i]); 19 sum1 += x[i]; 20 sum2 += y[i]; 21 } 22 flag = 0; 23 // printf("sum1 = %d sum2 = %d ", sum1, sum2); 24 if (sum1 % 2 || sum2 % 2) // 至少一边为奇数 25 { 26 for (i = 0; i < n; i++) 27 { 28 if ((x[i] % 2 && y[i] % 2 == 0) || (x[i] % 2 == 0 && y[i] % 2)) // 序列中第一次遇到奇偶的情况,只需要判断一次 29 { 30 // printf("x[%d] = %d, y[%d] = %d ", i, x[i], i, y[i]); 31 sum1 -= x[i]; // 调换之后两边的和发生改变 32 sum1 += y[i]; 33 sum2 -= y[i]; 34 sum2 += x[i]; 35 flag = 1; 36 // printf("sum1 = %d sum2 = %d ", sum1, sum2); 37 break; 38 } 39 } 40 } 41 if (!flag && sum1 % 2 == 0 && sum2 % 2 == 0) // 原来都为偶数,不需要交换 42 printf("0 "); 43 else if (!(sum1 % 2 == 0 && sum2 % 2 == 0)) // 处理后还是一奇一偶的情况 44 printf("-1 "); 45 else // 处理后符合都为偶数 46 printf("1 "); 47 } 48 return 0; 49 }