Codeforces 542F 构造

来源:互联网 发布:pdf压缩软件 for mac 编辑:程序博客网 时间:2024/05/16 08:36
/*被题目清纯的外表骗了,感觉就是个水题 = =!没想出来题目的意思是这样的,给出n(1000)个工作和时间T(100),每个工作有ti时间和qi有趣度要求用它们或者这些工作的子集来形成一棵二叉树满足如下条件1.有且只有叶子节点是一个工作2.工作的需要的时间ti加上该工作节点的深度<=T求最大的有趣程度解法就是:把工作按照需要的不同的时间分组从需要的时间少到需要的时间大扫描(相当于从树底向上扫描)对于当前深度i(需要的工作时间为i)的节点们来说,将他们按照有趣程度降序,依次取两个有趣程度最大的节点形成上一层的节点。最后T层的第一个数值就是答案。*/#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <iostream>#include <set>using namespace std;#define ll long long#define pb push_back#define PII pair<ll,ll>#define ALL(x) (x).begin(),(x).end()vector<int> g[111];int main(){    //freopen("in.txt","r",stdin);    int n,T;    scanf("%d%d",&n,&T);    for(int i=1;i<=n;i++){        int t,q;        scanf("%d%d",&t,&q);        g[t].pb(q);    }    for(int t = 1;t<=T;t++){        sort(ALL(g[t]),greater<int>());        for(int i=0;i<g[t].size();i+=2){            if(i+1 < g[t].size())                g[t+1].pb(g[t][i] + g[t][i+1]);            else                g[t+1].pb(g[t][i]);        }    }    printf("%d\n",g[T][0]);    return 0;}

0 0
原创粉丝点击