链接:https://codeforces.com/contest/1269/problem/D
题意:给一个不规则的网格,在上面放置多米诺骨牌,多米诺骨牌长度要么是1x2,要么是2x1大小,问最多放置多米诺骨牌的数量。
思路:首先这是一个结论题,对每个方格进行染色,一个方格染黑色,周围邻近的就染白色,答案就是黑色方格数量和白色方格数量的最小值。这个结论可以用二分图进行证明:把问题抽象成最大二分图匹配,每两个点之间连一条边。一个格子和周围格子连一条边,如果一个格子周围的还没被匹配,那么匹配数+1。如果一个格子周围已经全部被匹配完,那么该格子可以增广到任意一个为匹配位置,匹配数+1。所以只要在另一种颜色格子数量充沛的情况下,每一次匹配都能对匹配数贡献1,所以答案就是两种颜色的最小值。
AC代码:
1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<cstring> 5 #include<cstdio> 6 #include<algorithm> 7 #include<cmath> 8 using namespace std; 9 typedef long long ll; 10 ll mod = 1e9+7; 11 const int maxn = 2e5+10; 12 struct node{ 13 int dif; 14 int ti; 15 }g[maxn]; 16 bool cmp(node a,node b){ 17 if(a.ti !=b.ti ) return a.ti<b.ti ; 18 return a.dif <b.dif ; 19 } 20 bool check(ll x){ 21 for(int i = 2;i<=sqrt(x);i++){ 22 if(x%i == 0) return true; 23 } 24 return false; 25 } 26 int main(){ 27 ll black = 0 , white = 0; 28 int n;cin>>n; 29 int cur = 0; 30 for(int i = 0;i<n;i++){ 31 ll a ;cin>>a; 32 if(cur == 0){ 33 black +=(a/2+a%2); 34 white +=a/2; 35 cur = 1; 36 } 37 else{ 38 cur = 0; 39 black +=a/2; 40 white +=(a/2+a%2); 41 } 42 } 43 ll ans = min(black,white); 44 cout<<ans; 45 return 0; 46 }
原文地址:https://www.cnblogs.com/AaronChang/p/12147550.html
时间: 2024-11-08 13:55:46