1. 程式人生 > >Cram Time CodeForces - 1031C

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