【Codeforces 1031C】Cram Time
阿新 • • 發佈:2019-04-06
序列 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