校内胡策 埃罗芒阿老师 - 贪心 & 堆 + EX难度 - DP

题目描述

埃罗芒阿老师是著名的插画家,她的工作是为电击文库出版的的书画插画。快要到截稿日了,埃罗芒阿老师还在水>_<埃罗芒阿突然发现自己还有一大堆插画没有完成,如果不能在截稿时间内完成是要扣工资的。于是埃罗芒阿老师把每个任务所需的时间和现在(0 时刻)距离每个任务截稿的时间记录了下来,想要计算出最多可以完成多少任务。
输入描述

第一行是一个整数 N,接下来 N 行每行两个整数 T1,T2 描述一个任务:完成这个任务需要 T1 秒,如果在 T2 秒之内还没有完成任务,这个任务就到截稿时间了。
输出描述

输出一个整数 S,表示最多可以完成 S 个任务.
样例输入

4
100 200
200 1300
1000 1250
2000 3200
样例输出

3
数据范围及提示 对于 30%的数据,N≤100;
对于 60%的数据,N≤10000;
对于 80%的数据,N < 150,000; T1 < T2 <
INT_MAX;
对于 100%的数据,N < 150,000; T1 < T2 <
LLONG_MAX;
所有数据保证随机生成。

思路:由于自己是个蒟蒻,第一眼看到还以为是线段覆盖,结果for一遍就WA了。。易发现此题给出的是截至时间和任务时长,而线段覆盖给出的相当于是固定的区间,但此题的任务区间是不固定的,因此不能一遍for出结果。正解是利用大根堆存储

 P.S.: 线段覆盖相当于给出了完整的区间,而该题给出的是可能的范围与区间长度,但具体的区间位置并不确定。

AC Code:

#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int sz=150000+10;
struct node{
    ll t1,t2;
}a[sz];
bool cmp(node a,node b)
{
    if(a.t2==b.t2) return a.t1<b.t1;
    else return a.t2<b.t2;
}
priority_queue<node>q;
bool operator < (node a,node b)
{
    return a.t1<b.t1;
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld %lld",&a[i].t1,&a[i].t2);
    }
    sort(a+1,a+n+1,cmp);
    ll ans=0,now=0;
    for(int i=1;i<=n;i++)
    {
        if(now+a[i].t1<=a[i].t2)
        {
            ans++;
            q.push(a[i]);
            now+=a[i].t1;
        }
        else
        {
            node top=q.top();q.pop();
            now-=top.t1;
            if(top.t1<a[i].t1)
            {
                now+=top.t1;
                q.push(top);
            }
            else
            {
                now+=a[i].t1;
                q.push(a[i]);
            }
        }
    }
    printf("%lld",ans);
    return 0;
}

EX+

有n个任务,在一台机器上完成,机器一次只能做一个任务,第i个任
务需要ti个连续的时刻完成,截止日期在第di个时刻。在截止日期前
完成能得到收益vi。
? 安排顺序,使得收益最大。
? n<=1000,max{di}<=10000。

思路:

考虑简单情况:当所有任务的截至日期都为m的话,相当于一个体积为m的背包,每个任务相当于一个体积为ti,价值为vi的物品。

再跑一个0/1背包就行了。

又因为截至时间早的一定比截至时间晚的任务先做完。

因此我们将所有任务按截至时间从小到大排序,将背包体积设为最大的截至日期,然后跑0/1背包即可。

注意当 当前体积 即 当前时间 多于当前任务的工作时间 且小于 当前任务的截止日期 时,当前任务才有可能被加入背包。

max = max{d[i]}
for (i=1; i<=n; i++)
  for (j=0; j<=max; j++)
  {
    dp[i][j]=dp[i-1][j];
    if (j>=t[i] && j<=d[i]) dp[i][j]=max(dp[i][j-t[i]]+v[i],dp[i][j]);
  }

原文地址:https://www.cnblogs.com/Loi-Brilliant/p/8784573.html

时间: 2024-07-31 07:35:31

校内胡策 埃罗芒阿老师 - 贪心 & 堆 + EX难度 - DP的相关文章

校内胡策(唯一一个想出来的)

2 第一题 (third.cpp/c/pas) 题目描述 小 R 最近沉迷于一个叫做 Slay.one 的游戏. 在这个游戏中,每一局有若干人参加,最终会产生一个优胜者.优胜者会获得 一个成就点. 现在小 R 已经利用某种手段得知了每场游戏有哪些人参加.假设所有人最初成 就点都是 0 ,小 R 想要知道所有游戏结束之后成就点最多的人至少有多少成就点. 校内胡策(唯一一个想出来的) 原文地址:https://www.cnblogs.com/Lance1ot/p/9445468.html

【弱校胡策】2016.4.14 (bzoj2164)最短路+状压DP+矩阵乘法+高斯消元+树链剖分+线段树+背包DP

cyyz&qhyz&lwyz&gryz弱校胡策 命题人:cyyz ws_fqk T3暴力写挫了 50+10+0滚粗辣! 奇妙的约会(appointment.cpp/c/pas) [问题描述] DQS和sxb在网上结识后成为了非常好的朋友,并且都有着惊人 的OI水平.在NOI2333的比赛中,两人均拿到了金牌,并保送进入 HU/PKU.于是两人决定在这喜大普奔的时刻进行面基. NOI2333参赛选手众多,所以安排了n个考点,DQS在1号考点, 而sxb在n号考点.由于是举办全国性赛事

校内胡策 agar - BFS

problem 2 agar(agar.cpp)题目描述Skyfall 最近迷上了一个叫做 agar 的游戏.在这个游戏中,地图由 N*M 的点阵构成,每个 cell占有一个点.体积大的 cell 可以吃掉体积小的 cell,吃掉之后,较大的 cell 的大小会增加被吃掉的 cell 的大小.比如:你的大小为 3,吃掉了一个大小为 2 的 cell 之后你的大小变为 5.现在,地图上有 T 个细胞,第 i 个细胞的大小为 Qi,位置为 Xi,Yi .( 保 证 这 T 个 cell 坐标互不相同

校内胡策 T9270 mjt树

题目背景 从前森林里有一棵很大的mjt树,树上有很多小动物. 题目描述 mjt树上有 n 个房间,第 i 个房间住着 ai 只第bi 种小动物. 这n个房间用n-1条路连接起来,其中房间1位mjt树的根. 现在每个房间x的小动物想知道,以房间x为根的mjt树中有多少只它们的同类. 输入输出格式 输入格式: 第一行一个整数n,表示房间数 接下来n行,每行两个整数ai,bi 再之后n-1,每行两个整数x.y,表示x和y之间有一条路径 输出格式: 一行n个数,第i个数表示以房间i为根的mjt树中bi种

【胡策篇】题目

和泉纱雾与烟花大会(eromanga) 时间限制: 2s 空间限制: 256MB 题目背景 和泉纱雾是个灰常可爱的女孩子. 你永远不知道有多少恶心的死宅看到了纱雾之后, 便吵着换老婆, 正如三个月前和三个月后的他们一样. 作为一个家里蹲, 她看到了电视上转播的烟花大会, 于是特别想去看. 他的哥哥和泉正宗决定抓住这大好的机会带她去看烟花. 这一对兄妹有说有笑的来到了烟花大会的会场. (德国骨科了解一下←_←) 题目描述 烟花大会的会场非常大, 一共有\(n\)个观景点. 这\(n\)个观景点通过

弱省胡策系列简要题解

现在不是非常爽,感觉智商掉没了,就整理一下最近弱省胡策的题目吧. 其实题目质量还是很高的. 如果实在看不懂官方题解,说不定这里bb的能给您一些帮助呢? [弱省胡策]Round #0 A 20%数据,O(n4)傻逼dp. 40%数据,O(n3)傻逼dp. 100%数据,令f(x1,y1,x2,y2)表示从(x1,y1)走到(x2,y2)的路径条数.于是所有路径就是f(1,2,n?1,m)×f(2,1,n,m?1).然而两条路径可能在中间的某个点相交,我们找出最早的交点,并在这个交点互换两条路径的后

UESTC 886 方老师金币堆

环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=min(dp[i][k]+dp[k+1][j]+sum[i][j]); 复杂度:O(n^3). 可考虑四边形优化. 代码: #include <iostream> #include <cstdio> #include <cstring> #include <cmath&g

山西胡策 #7

A. B. C. 题意:给出(i, j)之类的约束表示要j必须先i,问1尽量靠前.2尽量靠前.3尽量靠前以此类推的最优方案,或输出无解. #include <bits/stdc++.h> using namespace std; const int N=100005; int cnt, ihead[N], in[N], ans[N], tot, n, m; struct E { int next, to; }e[N]; void add(int x, int y) { e[++cnt]=(E)

山西胡策 #6

A. 题意:求去掉d物品后容量为e最大背包.每个物品有三种属性,权值.容量.数量. #include <bits/stdc++.h> using namespace std; const int V=1000, N=1005; void zop(int *d, int w, int v) { for(int i=V; i>=v; --i) d[i]=max(d[i], d[i-v]+w); } void cmp(int *d, int w, int v) { for(int i=v; i