E. Kuroni and the Score Distribution-(構造+貪心)

總結

一到構造就是一頓操作猛如虎,寫完發現全是BUG。

解析

第一步:先貪心構造最大數量,1 2 3 4 5這樣的順序,每次增加,是最大的數量的遞增,構造不超過n,滿足的p
第二步:在構造不滿足的,並且構造一坨奇數,並且每個奇數差值大於構造最大數量的最大值
理由1:奇數+奇數!=奇數
理由2:奇數+小一點的數<奇數+差值(小一點的數<差值)

題目鏈接

#include<bits/stdc++.h>
//typedef long long ll;
//#define ull       unsigned long long
#define int       long long
#define F           first
#define S           second
#define endl        "\n"//<<flush
#define eps         1e-6
#define lowbit(x)   (x&(-x))
#define PI          acos(-1.0)
#define inf         0x3f3f3f3f
#define MAXN        0x7fffffff
#define INF         0x3f3f3f3f3f3f3f3f
#define pa          pair<int,int>
#define ferma(a,b)  pow(a,b-2)
#define pb          push_back
#define all(x)      x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS         ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
    freopen("cin.txt","r",stdin);
    //  freopen("cout.txt","w",stdout);
#endif
}
signed main()
{
    IOS;
    //file();
    vector<int>ans;
    int n,m,flag=0,pos=0;
    cin>>n>>m;
    while(++pos)
    {
        int num=(pos-1)/2;
        if(pos<=n&&num<=m)
            ans.pb(pos),m-=num;
        else
            break;
    }
    pos--;
    if(m)
    {
        int num=(pos-m)*2+1;
        ans.pb(num);
        pos++;
    }
    if(pos>n)
    {
        cout<<-1<<endl;
        return 0;
    }
    int num=ans[pos-1];
    num+=(num%2?3:2);
    int temp=num+1;
    for(int i=pos;i<n;i++)
    {
        temp+=num;
        ans.pb(temp);
    }
    sort(all(ans));
    for(auto it:ans)
        cout<<it<<" ";
    cout<<endl;
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章