CF-1072-C. Cram Time(贪心,数学)
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\n",a1.size());
    for(auto x : a1)printf("%d ",x);
    puts("");
    printf("%d\n",b1.size());
	for(auto x : b1)printf("%d ",x);
	puts("");
    return 0;
}
    注:转载请注明出处
 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号