洛谷P10582 [蓝桥杯 2024 国 A] 最强策略家

一开始,A可以下两颗子,起初棋盘上很空,棋与棋之间距离大,B只能挡住一颗,随着回合数的增加,B能覆盖的正方形范围越来越大,B能挡住的棋子的数目在某一回合x 后会大于等于2,之后A就不占优势了,没法让棋盘上的棋子的数目增加

在1到x回合,A每次下棋能让棋盘上多一颗子,则第x回合,棋盘上有x个子,第x回合要想不被A遮住两颗子,任意两颗棋子之间的横距离要大于等于x,纵距离也要大于等于x,则第x回合最多放的棋子数目是 ( 向上取整(n/x) )的平方 个,若x大于等于这个数目,则第x回合B覆盖的棋子数目超过了1,(x等于这个数目的时候,第x回合A放的两个子中有一个已经不在了当前局面能放的最密集的子的位置,在第x回合B出手的时候就可以覆盖两个子),所以二分查找x,使得x严格小于第x回合最多放的棋子数目,找这样的最大的x,则1-x回合能稳定放x个子,之后棋子数量不会超过当前局面了

第x+1回合,A还能再放两个,因此答案+2,答案不能超过棋盘填满时其上的子的数量

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

#define ll long long

int main()
{
    ios::sync_with_stdio(0);cin.tie(0);

    ll T;cin>>T;
    while(T--){
        ll n;cin>>n;
        ll l=1,r=n+1,ans=-1;
        while(l<r){
            ll mid=(l+r)>>1;
            if(mid<pow((n+mid-1)/mid,2)){
                ans=mid;
                l=mid+1;
            }else {
                r=mid;
            }
        }
        cout<<min(ans+2,n*n)<<"\n";
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值