D. Domino for Young
基本思想是利用涂色的方法,用黑白两种颜色把方格全部涂色,相邻方格不同色。
方法1:基于二分图匹配的思想
一开始也想过二分图匹配,但数据量太大,就放弃了这种想法。其实根据增广路的定义。如果白色的方格的数量小于黑色方格数量,那么当白色方格还没有匹配完时,一定有黑色的方格没有匹配。那么从该白色的方格出发,一定可以走出一条增广路到达黑色的方格。即数量少的颜色一定可以匹配完。那么只要求出二者数量的最小值即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
方法2:
对于每一列,一列一列的放的话,那么如果该列的方格数量为偶数那么最后该列一定不剩下方格,如果为奇数,那么肯定会剩下一个,所以最终结果就是如果黑色和白色的方格数量不等的话,那么最后一定会剩下。且数量少的一定会被删除。