CF-1072-C. Cram Time
http://codeforces.com/contest/1072/problem/C
题意:
第一天有 a 小时,第二天有 b 小时。第 k 个任务需要 k 个小时来完成。任务不能隔天做(即第一天开始,第二天结束)。问这两天分别可以最多完成多少任务,并输出。
分析:
- 既然总共有
a+b
个小时,那么每个任务所需时间越少,任务数越多。即我们要找到一个最大的k
有(k*(k+1)/2 le (a+b)) 即前k
个任务的所需时间和小于等于a+b
- 找到k之后,从k倒序遍历。遇到可以在第一天完成的(即当前任务所需时间小于a),就在第一天完成,然后第一天时间
a -= i
,除去第一天完成的任务,剩下的就是第二天的。
typedef long long ll;
int main()
{
//因为后面计算k的前缀和可能超int,所以这里k和a,b都为longlong
ll a,b,k=0;
cin>>a>>b;
vector<int> a1,b1;
//这里有个小细节,要保留最大的具有可行性的k。
while((k+2)*(k+2)/2 <= a+b) k++;
for(int i=k;i>=1;i--)
{
//若可在第一天内完成
if(a>=i)
{
a-=i;
a1.push_back(i);
}
else b1.push_back(i);
}
printf("%d
",a1.size());
for(auto x : a1)printf("%d ",x);
puts("");
printf("%d
",b1.size());
for(auto x : b1)printf("%d ",x);
puts("");
return 0;
}