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

在這裏插入圖片描述
原題鏈接
題意:
就是兩個人在那比賽。如果a能找到使b輸的構造方式,那麼a贏輸出yes並輸出所構造序列,如果不能找到就輸出no。
思路:
首先先蹦入我腦子裏的是構造出n-1個1,那麼剩下的就是s-n+1像下面這樣
1,1,1,...,SN+11,1,1,...,S-N+1把這個序列叫做t序列把。
這個時候能注意到[1,n1][1,n-1]內的所有數都可以構造出來,同時我們注意到,從[sn+1,s][s-n+1,s]這個區間內的所有數也可以構造出來,那麼我們可以稱t序列所能構造出來的數的範圍是這個
[1,n1]U[sn+1,s][1,n-1]U[s-n+1,s]注意都是閉區間
那麼爲了讓a贏,就必須找到t序列所不能構造出來的任意一個數,那麼這就很簡單了,只要讓左右兩個區間的端點交錯開來,使得sn>n1s-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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章