Codeforces Round #643 (Div. 2)D. Game With Array(思维)

在这里插入图片描述
原题链接
题意:
就是两个人在那比赛。如果a能找到使b输的构造方式,那么a赢输出yes并输出所构造序列,如果不能找到就输出no。
思路:
首先先蹦入我脑子里的是构造出n-1个1,那么剩下的就是s-n+1像下面这样
1 , 1 , 1 , . . . , S − N + 1 1,1,1,...,S-N+1 1,1,1,...,SN+1把这个序列叫做t序列把。
这个时候能注意到 [ 1 , n − 1 ] [1,n-1] [1,n1]内的所有数都可以构造出来,同时我们注意到,从 [ s − n + 1 , s ] [s-n+1,s] [sn+1,s]这个区间内的所有数也可以构造出来,那么我们可以称t序列所能构造出来的数的范围是这个
[ 1 , n − 1 ] U [ s − n + 1 , s ] [1,n-1]U[s-n+1,s] [1,n1]U[sn+1,s]注意都是闭区间
那么为了让a赢,就必须找到t序列所不能构造出来的任意一个数,那么这就很简单了,只要让左右两个区间的端点交错开来,使得 s − n > n − 1 s-n>n-1 sn>n1就可以了,整理一下得到以下信息:
若s-n>n-1则a能赢,输出yes,并输出序列。
反之,若s-n<=n-1则两个区间有重合相等部分,则a无论如何也构造不出目标序列,输出no
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n,s;
    cin>>n>>s;
    if(s-n+1<=n) cout<<"NO"<<endl;
    else
    {
        cout<<"YES"<<endl;
        for(int i=1;i<=n-1;i++) cout<<1<<" ";
        cout<<s-n+1<<endl;
        cout<<s-n<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值