原题链接
题意:
就是两个人在那比赛。如果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,...,S−N+1把这个序列叫做t序列把。
这个时候能注意到
[
1
,
n
−
1
]
[1,n-1]
[1,n−1]内的所有数都可以构造出来,同时我们注意到,从
[
s
−
n
+
1
,
s
]
[s-n+1,s]
[s−n+1,s]这个区间内的所有数也可以构造出来,那么我们可以称t序列所能构造出来的数的范围是这个
[
1
,
n
−
1
]
U
[
s
−
n
+
1
,
s
]
[1,n-1]U[s-n+1,s]
[1,n−1]U[s−n+1,s]注意都是闭区间
那么为了让a赢,就必须找到t序列所不能构造出来的任意一个数,那么这就很简单了,只要让左右两个区间的端点交错开来,使得
s
−
n
>
n
−
1
s-n>n-1
s−n>n−1就可以了,整理一下得到以下信息:
若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;
}