原題鏈接
題意:
就是兩個人在那比賽。如果a能找到使b輸的構造方式,那麼a贏輸出yes並輸出所構造序列,如果不能找到就輸出no。
思路:
首先先蹦入我腦子裏的是構造出n-1個1,那麼剩下的就是s-n+1像下面這樣
把這個序列叫做t序列把。
這個時候能注意到內的所有數都可以構造出來,同時我們注意到,從這個區間內的所有數也可以構造出來,那麼我們可以稱t序列所能構造出來的數的範圍是這個
注意都是閉區間
那麼爲了讓a贏,就必須找到t序列所不能構造出來的任意一個數,那麼這就很簡單了,只要讓左右兩個區間的端點交錯開來,使得就可以了,整理一下得到以下信息:
若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;
}