题目链接
题目描述
现在你有两天的时间备考,两天各有 a 小时, b小时。
每天可以看若干份笔记。编号为k的笔记需要看k小时(请不要忽略,最后输出有用)。为了考得更好,你需要最大化看的笔记份数。请你求出最多能看多少份笔记。
注意,看过的笔记需要都不相同。即使是不在同一天看的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <bits/stdc++.h> using namespace std; typedef long long ll;
ll a, b;
bool check(ll x, ll a, ll b){ return x*(x+1)/2 <= a + b; }
int main(){ scanf("%lld%lld", &a, &b); ll l = 1, r = 200000; ll ans = -1; while(l <= r){ ll mid = l+r >> 1; if(check(mid, a, b)){ l = mid+1; ans = mid; }else { r = mid-1; } } set<int> st; int x = min(a, b); for(int i = ans; i >= 1; i--){ if(i > x) continue; st.insert(i); x -= i; } set<int> st2; for(int i = 1; i <= ans; i++){ if(!st.count(i)){ st2.insert(i); } } if(a > b) swap(st, st2); cout << st.size() << endl; for(auto it:st){ cout << it << ' '; }cout << endl; cout << st2.size() << endl; for(auto it:st2){ cout << it << ' '; }cout << endl;
return 0; }
|