CF4B Before an Exam

 

题解 CF4B 【Before an Exam】

超水的一道贪心题 贪心

贪心的定义

       贪心选择是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。贪心选择是采用从顶向下、以迭代的方法做出相继选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题。对于一个具体问题,要确定它是否具有贪心选择的性质,我们必须证明每一步所作的贪心选择最终能得到问题的最优解。

最优子结构

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。运用贪心策略在每一次转化时都取得了最优解。问题的最优子结构性质是该问题可用贪心算法或动态规划算法求解的关键特征。贪心算法的每一次操作都对结果产生直接影响,而动态规划则不是。贪心算法对每个子问题的解决方案都做出选择,不能回退;动态规划则会根据以前的选择结果对当前进行选择,有回退功能。动态规划主要运用于二维或三维问题,而贪心一般是一维问题

好的,话不多说,上代码~

谢谢观看~

​#include<bits/stdc++.h>
using namespace std;
struct node {
    int min,max,delta;
} e[31],sum;
int main() {
    int d,t;
    cin>>d>>t;
    for(int i=0; i<d; ++i) {
        cin>>e[i].min>>e[i].max;
        e[i].delta=e[i].max-e[i].min;
        sum.min+=e[i].min;
        sum.max+=e[i].max;
    }
    if(sum.max<t||sum.min>t) cout<<"NO";
    else {
        cout<<"YES\n";
        t-=sum.min;
        for(int i=0; i<d; ++i) 
            if(t>=e[i].delta) cout<<e[i].max<<" ",t-=e[i].delta;
            else cout<<t+e[i].min<<endl,t=0;
    }
    return 0;
}

 

posted @ 2020-02-11 17:34  BorisDimitri  阅读(41)  评论(0编辑  收藏  举报