给你n个柱体,让你用1x2的方块覆盖,问最多能够覆盖多少个方格。
思路:我们用类似于二分图染色的思想。把方块染成为黑白。
假设黑色块比白色块多。那么对于一个没有匹配的白块一定有一个没有匹配的黑块和其对应,而且一定能从这个没有匹配的白块开始找到一条增广路h-b-h-b-h到这个没有匹配的黑块,那么这个白块一定可以匹配成功。所有覆盖的块数就是min(黑块数, 白块数)。
#include <bits/stdc++.h>
#define LL long long
#define mid (l+r>>1)
using namespace std;
int main(){
int n, x; scanf("%d", &n);
LL ans=0, s1=0, s2=0;
for(int i=1; i<=n; i++){
scanf("%d", &x);
s1+=x/2; s2+=x/2;
if(x%2){
if(i%2){
s1++;
}
else{
s2++;
}
}
}
cout<<min(s1, s2)<<endl;
return 0;
}
京公网安备 11010502036488号