zoukankan      html  css  js  c++  java
  • 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
    ",a1.size());
        for(auto x : a1)printf("%d ",x);
        puts("");
        printf("%d
    ",b1.size());
    	for(auto x : b1)printf("%d ",x);
    	puts("");
        return 0;
    }
    
  • 相关阅读:
    20-存储过程
    21-事务
    18-触发器
    19-函数
    16-pymysql模块的使用
    17-视图
    CodeForces 1369B. AccurateLee
    CodeForces 1312D.Count the Arrays(组合数学)
    CodeForces 1362D. Johnny and Contribution
    CodeForces 1363F. Rotating Substrings
  • 原文地址:https://www.cnblogs.com/1625--H/p/9829027.html
Copyright © 2011-2022 走看看