题目链接:http://codeforces.com/problemset/problem/353/A
题目意思:通俗地说,就是当上下两半的数的总和不完全是偶数时,通过上下调换某些骨牌来使这两半的数和变成偶数,统计并输出调换多少次;如果不行,则输出-1。
其实调换的次数最多只有1次,而实行调换的操作必须符合上下对应的数满足一奇一偶的条件,否则是白做的。如果调换一次之后,也不能使得上下两半的和都为偶数,那么就没必要继续判断了,直接输出“-1”。
1 #include2 #include 3 #include 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\nsum2 = %d\n\n", 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\n", 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\nsum2 = %d\n", sum1, sum2);37 break;38 }39 }40 }41 if (!flag && sum1 % 2 == 0 && sum2 % 2 == 0) // 原来都为偶数,不需要交换42 printf("0\n");43 else if (!(sum1 % 2 == 0 && sum2 % 2 == 0)) // 处理后还是一奇一偶的情况44 printf("-1\n");45 else // 处理后符合都为偶数46 printf("1\n");47 }48 return 0;49 }