Cram Time CodeForces - 1031C

In a galaxy far, far away Lesha the student has just got to know that he has an exam in two days. As always, he hasn’t attended any single class during the previous year, so he decided to spend the remaining time wisely.
Lesha knows that today he can study for at most a hours, and he will have b hours to study tomorrow. Note that it is possible that on his planet there are more hours in a day than on Earth. Lesha knows that the quality of his knowledge will only depend on the number of lecture notes he will read. He has access to an infinite number of notes that are enumerated with positive integers, but he knows that he can read the first note in one hour, the second note in two hours and so on. In other words, Lesha can read the note with number k in k hours. Lesha can read the notes in arbitrary order, however, he can’t start reading a note in the first day and finish its reading in the second day.
Thus, the student has to fully read several lecture notes today, spending at most a hours in total, and fully read several lecture notes tomorrow, spending at most b hours in total. What is the maximum number of notes Lesha can read in the remaining time? Which notes should he read in the first day, and which — in the second?

Input
The only line of input contains two integers a and b (0≤a,b≤109) — the number of hours Lesha has today and the number of hours Lesha has tomorrow.

Output
In the first line print a single integer n (0≤n≤a) — the number of lecture notes Lesha has to read in the first day. In the second line print n distinct integers p1,p2,…,pn (1≤pi≤a), the sum of all pi should not exceed a.
In the third line print a single integer m (0≤m≤b) — the number of lecture notes Lesha has to read in the second day. In the fourth line print m distinct integers q1,q2,…,qm (1≤qi≤b), the sum of all qi should not exceed b.
All integers pi and qi should be distinct. The sum n+m should be largest possible.

总的来说这一题就是合理安排复习时间,使得看的书越多越好
然后他看书所花费的时间是 从 一小时,逐渐增加,每次增加一小时,我们记做最大时间为 x
那么想让他看的笔记越多越好,那么一定是 1~x内的数 那么我们的目标就是求出 这个最大x
由等差数列求和可以知道 a+b >= (1+x)*x/2 来找到这个x之后,从大到小一个个插入即可,
AC代码如下:

#include <iostream>
#include <climits>
#include <cmath>
#include <algorithm>
using namespace std;
const int maxn=1e5;
int a[maxn];
int b[maxn];
int main()
{
    long long n,m;
    while(cin>>n>>m)
    {
        long long pos=0;
        pos=int(sqrt(2*(n+m)+1.0/4)-0.5);
        long long cnt=0,vis=0;
        for(int i=pos;i>=1;i--)
        {
            if(i<=n)
            {
                a[cnt++]=i;
                n-=i;
            }
            else if(i<=m)
            {
                b[vis++]=i;
                m-=i;
            }
        }
        cout<<cnt<<endl;
        for(int i=0;i<cnt;i++)
        {
            if(i)
                cout<<' '<<a[i];
            else cout<<a[i];
        }
        cout<<endl;
        cout<<vis<<endl;
        for(int i=0;i<vis;i++)
        {
            if(i)
                cout<<' '<<b[i];
            else cout<<b[i];
        }
        cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43508782/article/details/84936746