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;
}

发布了149 篇原创文章 · 获赞 5 · 访问量 6892

猜你喜欢

转载自blog.csdn.net/weixin_44224825/article/details/104668518