P11143 「SFMOI Round I」Strange Cake Game

解题思路

这道题目描述了一个矩形蛋糕的分割问题,小 W 和小 M 轮流移动蛋糕刀,将蛋糕分成两部分。小 W 希望最大化自己获得的巧克力数量,而小 M 则希望最小化小 W 获得的巧克力数量。双方都采取最优策略。

关键观察点:

  1. 巧克力位置的判定:巧克力位于坐标 $(x_i-0.5, y_i-0.5)$,即对应网格的中心点。小 W 获得的是右上部分,小 M 获得的是左下部分。

  2. 分割线的性质:分割线是从 $(0,0)$ 到 $(n,m)$ 的一条路径,只能向右或向上移动。对于任意巧克力 $(x_i-0.5, y_i-0.5)$,如果分割线在其右下方,则该巧克力归小 W;否则归小 M。

  3. 最优策略:双方的最优策略是尽可能让分割线通过尽可能多的对自己有利的巧克力。实际上,最优策略会将分割线尽可能靠近对角线,因为这样可以将巧克力分为两部分:$x_i \leq y_i$ 的归小 W,$x_i > y_i$ 的归小 M。

因此,最终小 W 能获得的巧克力数量就是所有满足 $x_i \leq y_i$ 的巧克力的数量。

代码注释

#include<bits/stdc++.h>
#define f(i,s,e) for(int i = s; i <= e; i++) // 定义循环宏,从s到e
#define ll long long // 定义long long类型别名
using namespace std;
const int N = 1e3+10,inf = 0x3f3f3f3f; // 定义常量和无穷大值(实际未使用)
ll n,m,k,ans; // n和m是蛋糕的尺寸,k是巧克力数量,ans是小W能获得的巧克力数量

int main()
{
    cin >> n >> m >> k; // 输入蛋糕尺寸n,m和巧克力数量k
    while(k--) // 处理每一块巧克力
    {
        ll x,y;
        cin >> x >> y; // 输入巧克力的坐标(实际是(x-0.5, y-0.5))
        if(x <= y) ans++; // 如果x <= y,这块巧克力归小W
    }
    cout << ans; // 输出小W能获得的巧克力数量
    return 0;
}

 

posted @ 2025-06-11 18:07  CRt0729  阅读(17)  评论(0)    收藏  举报