1. 程式人生 > >【Codeforces 1031C】Cram Time

【Codeforces 1031C】Cram Time

序列 efi name 註意 一個 http else codeforce esp

【鏈接】 我是鏈接,點我呀:)
【題意】


題意

【題解】


如果找到最大的n使得1+2+...+n<=a+b
然後第一天輸出1,2.3,4....t1
這裏1+2+..+t1<=a
這還遠遠不夠。
因為可能1+2+3...+t1<a
這就使得第一天還有剩余的時間沒有用.
那麽接下來如果繼續讓第二題從t1+1..n的話
可能第二題的累加和會大於b
所以我們可以這樣,
讓第二題再加上一天。
即輸出1,2.3....t1,t1+1
然後從中刪掉一個數字x=1+2+3..+t1+(t1+1)-a
顯然這個數字是小於t1+1的,所以一定在第一天輸出的序列中.
這樣的話,第一題就能滿滿地用夠a小時了。

然後再把x在第二題輸出就好了,然後第二題從t1+2開始輸出。。
註意t1=n的情況,這種情況的話,第二題就不用輸出任何數字了,x也不用輸出啦

【代碼】

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 1e5;

ll a,b;
ll n;
int tag[N+10];

int main(){
    ios::sync_with_stdio(0),cin.tie(0);
    cin >> a >> b;
    //(1+n)*n/2
    for (n = 0;n*(1+n)/2<=(a+b);n++);
    n--;
    ll t1 = 0;
    for (t1 = 1;t1*(t1+1)/2<=a;t1++);
    t1--;
    if (t1*(t1+1)/2==a){
        cout<<t1<<endl;
        for (ll i = 1;i <= t1;i++){
            cout<<i<<" ";
        }
        cout<<endl;
        cout<<n-t1<<endl;
        for (ll i = t1+1;i <= n;i++){
            cout<<i<<" ";
        }
    }else{
        t1++;
        ll temp = t1*(t1+1)/2-a;
        cout<<t1-1<<endl;
        int cnt = 0;
        for (ll i = 1;i <= t1;i++)
            if (i!=temp){
                cout<<i<<" ";
                cnt++;
            }
        if (cnt>0) cout<<endl;
        cout<<n-(t1-1)<<endl;
        if (n-(t1-1)>0)cout<<temp<<" ";
        for (ll i = t1+1;i <= n;i++){
            cout<<i<<" ";
        }
    }

    return 0;
}

【Codeforces 1031C】Cram Time