Cram Time CodeForces - 1031C

在遥远的星系,学生莱沙得知两天后要考试。由于全年未上课,他决定充分利用剩余时间复习。莱沙今天有a小时,明天有b小时来学习。他知道阅读编号为k的讲义需要k小时。为了最大化阅读的讲义数量,他需要确定今天和明天分别阅读哪些讲义。输入包含两个整数a和b,输出应包括莱沙这两天分别要读的讲义数量及其编号,确保总数最大且不超出时间限制。通过等差数列求和公式找到最大可能的讲义数量x,然后按降序排列并分配给两天。
摘要由CSDN通过智能技术生成

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值