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;
}

题目链接 :https://codeforces.com/problemset/problem/1268/B

posted @ 2024-05-06 22:43  sty_stability  阅读(18)  评论(0)    收藏  举报