CF 1268B
题目大意
给一张杨氏图 给出的图是一个直方图 满足a1>=a2>=a3.....>=an (1<=a<=300000) (1<=n<=300000)
要求找到最大不重叠多骨诺骨牌(1 X 2和2 x 1矩阵)
正文部分
先讲一下做法:对图进行黑白颜色,设黑色格子有a个,白色格子有b个,答案为 min(a,b)
证明
先证明答案上限为min(a,b) 因为多骨诺骨牌覆盖的是一个黑一个白 显然最多能覆盖min(a,b)
证毕
再证明答案能取到min(a,b)
不妨设a<=b。
先考虑 a=b的情况
每次一定能找到最外面的两个长度相同且相邻的行或列,删之,显然仍有a=b。
若找不到,则成阶梯状,每一层的格数都是上一层格数 +1,此时黑白格子数不等,矛盾。
所以一定能删完,即能被铺满,答案为(a+b)/2,所以答案为 min(a,b)。
a<b的情况
与a=b的情况类似:如果有两个相邻的长度相同的行或列,就删去它们。每次删完仍然满足行的长度度不下降。
若找不到,则必有一个单独在外的白格(a < b)。假设其不存在,继续删,删到最后必删完(与a=b类似)则只剩若干个不存在的白格,黑色全部删完。
所以答案为黑格格数,即 min(a,b)。
代码如下
inline void solve()
{
cin >> n;
int sum=0;
for(int i=1;i<=n;i++) cin >> a[i],sum+=a[i];
int ans=0;
for(int i=1;i<=n;i++)
{
if(i&1) ans+=(a[i]+1)/2;
else ans+=a[i]/2;
}
cout << min(ans,sum-ans) << endl;
}

浙公网安备 33010602011771号