D. Domino for Young

基本思想是利用涂色的方法,用黑白两种颜色把方格全部涂色,相邻方格不同色。

方法1:基于二分图匹配的思想

一开始也想过二分图匹配,但数据量太大,就放弃了这种想法。其实根据增广路的定义。如果白色的方格的数量小于黑色方格数量,那么当白色方格还没有匹配完时,一定有黑色的方格没有匹配。那么从该白色的方格出发,一定可以走出一条增广路到达黑色的方格。即数量少的颜色一定可以匹配完。那么只要求出二者数量的最小值即可。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=3e5+5;
 4 int a[N];//把图涂成两种颜色: 黑和白
 5 int n;//求黑色和白色块的数量的最小值
 6 int main()
 7 {
 8     while(scanf("%d",&n)!=EOF)
 9     {
10        long long ans1=0,ans2=0;
11        int a;
12        for(int i=1;i<=n;i++)
13        {
14            scanf("%d",&a);
15            ans1+=(a/2);
16            ans2+=(a/2);
17            if(i&1)
18            {
19                if(a&1)
20                 ans1++;
21            }
22            else
23            {
24                if(a&1)
25                 ans2++;
26            }
27        }
28        printf("%lld\n",min(ans1,ans2));
29     }
30     return 0;
31 }
View Code

方法2:

对于每一列,一列一列的放的话,那么如果该列的方格数量为偶数那么最后该列一定不剩下方格,如果为奇数,那么肯定会剩下一个,所以最终结果就是如果黑色和白色的方格数量不等的话,那么最后一定会剩下。且数量少的一定会被删除。

posted @ 2019-12-27 21:17  xzx9  阅读(309)  评论(0编辑  收藏  举报