Codeforces Round 766 (Div. 2) (博弈论 + 贪心)

拉胡尔和蒂娜期待着在大学开始新的一年。当他们走进新教室时,他们发现学生的座位被排列成一个 n×m 网格。位于第 r 行和第 c 列的座位用 (r,c) 表示,两个座位 (a,b) 和 (c,d) 之间的距离是 |a−c|+|b−d| 。

作为班长,蒂娜可以用 k 桶粉色颜料。下面的过程是

  • 首先,蒂娜在教室里选择 k 个座位涂上粉色颜料。一桶颜料正好可以涂一个座位。
  • 当蒂娜在上一步涂完 k 个座位后,拉胡尔选择他的座位。由于讨厌粉色,他不会选择涂了粉色的座位。
  • 拉胡尔选好座位后,蒂娜为自己选座位。她可以选择拉胡尔所选座位以外的任何一个座位,无论是否涂了粉色。

拉胡尔想选一个离蒂娜越近越好的座位。然而,蒂娜却想坐在离拉胡尔越远越好的位置上,因为她和拉胡尔之间有一些复杂的关系史,我们无法将其写入陈述中!

现在,拉胡尔想知道 k=0,1,…,n⋅m−1 ,如果蒂娜有 k 桶油漆,如果拉胡尔和蒂娜都知道对方的意图,并且他们都尽可能有策略地行动,拉胡尔可以坐在离蒂娜多近的地方?请帮助满足拉胡尔的好奇心!

输入

输入由多个测试用例组成。第一行包含一个整数 t ( 1≤t≤5⋅104 ) - 测试用例的数量。测试用例说明如下。

每个测试用例的第一行包含两个整数 n , m ( 2≤n⋅m≤105 ) --教室里座位的行数和列数。

所有测试用例中 n⋅m 的总和不超过 105 。

输出

对于每个测试用例,输出 n⋅m 个有序整数–如果拉胡尔和蒂娜在每个 k∈[0,n⋅m−1] 中都以最佳方式行动,则拉胡尔和蒂娜之间的距离。


很容易发现,拉胡尔肯定是会去选择尽量靠中间的位置,因为这样能够尽可能保证距离四个角最近,而蒂娜又一定会去选择四个角的位置,因为这样能够距离拉胡尔最远。

那么只需要与处理出来每个点对应的离自己最短的角落的距离,然后存储后进行排序,这样循环输出k次,因为每次填上一个就一定会导致距离增加,而双方绝顶聪明的话就一定能够保证当前最优解。

#include<bits/stdc++.h>
using namespace std;

void solve(){
    int n,m;
    cin >> n >> m;
    vector<int>dis;
    
    for(int i = 0;i < n;i++){
        for(int j = 0;j < m;j++){
            dis.push_back(max(i,n - i -1) + max(j,m - j - 1));
        }
    }
    sort(dis.begin(),dis.end());
    for(int k = 0;k < n*m;k++)cout << dis[k] << " ";
    puts("");
}

int main(){
    int T;cin >> T;
    while(T--){
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值