codeforces A. Domino 解题报告

题目链接: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 }

   

原文地址:https://www.cnblogs.com/windysai/p/3372953.html