博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ1572] WorkScheduling
阅读量:4884 次
发布时间:2019-06-11

本文共 1391 字,大约阅读时间需要 4 分钟。

中文题目:工作安排

原文题目:Work Scheduling

本题可以采用贪心

算法一:按工作时间排序,如果工作能按时完成的工作就按时完成,如果工作不能按时完成就把之前价值最小的工作和当前作比较,取最优的情况。考虑使用堆维护工作价值。

算法二:按工作价值排序,因为所有工作花费的是一样的,价值大的尽量完成,考虑把工作拖到最后完成。每个工作从完成期限往前找,找到第一个空的时段,用这个时间完成工作。考虑用并查集快速查找空的时段。如果该工作完成时间>n,则一定可以完成,并查集只要维护<=n的部分。

1 #include 
2 #include
3 #include
4 #define LL long long 5 struct Work{
int d,p;}W[100005]; 6 std::priority_queue
,std::greater
>Q; 7 bool cmp(Work A,Work B){ return A.d
 
#include 
#include
#define LL long long int Pre[100005];struct Work{
int d,p;}W[100005];bool cmp(Work A,Work B){
return A.p>B.p;}int GetPre(int x){
return Pre[x]==x?x:Pre[x]=GetPre(Pre[x]);}int main(){ //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int n;LL ans=0; scanf("%d",&n); for(int i=1;i<=n;++i) scanf("%d %d",&W[i].d,&W[i].p); std::sort(W+1,W+n+1,cmp); for(int i=1;i<=n;++i)Pre[i]=i; for(int i=1,pre;i<=n;++i) if(W[i].d>n){ ans=ans+W[i].p; }else{ pre=GetPre(W[i].d); if(!pre)continue; ans=ans+W[i].p; Pre[pre]=pre-1; } printf("%lld",ans); //fclose(stdin);fclose(stdout); return 0;}

 

转载于:https://www.cnblogs.com/hjj1871984569/p/6049855.html

你可能感兴趣的文章
git形成本地仓库并从远处url拉取
查看>>
获取xml字符串中的属性值
查看>>
MySQL必知必会(数据分组,Group by和Having子句, Select子句的顺序)
查看>>
通过wireshark抓包来讲解HTTP中Connection: keep-alive头部的作用
查看>>
2015长春 HDU 5531 Rebuild
查看>>
Android之四种加载方式
查看>>
团队项目3.0
查看>>
【js】操作checkbox radio 的操作总结
查看>>
mysql复制表(同一数据库,不同数据库)
查看>>
Spring中 @Autowired标签与 @Resource标签
查看>>
面向对象的六大原则
查看>>
python的基本用法(三)字符串常用函数
查看>>
第二章例2-2
查看>>
Java8——快速入门手册(学习笔记)
查看>>
p2p-如何拯救k8s镜像分发的阿喀琉斯之踵
查看>>
linux之多进程
查看>>
iphone设置铃声
查看>>
python基础
查看>>
HDU 3277 最大流+二分
查看>>
Angular 学习笔记 :初识 $digest , $watch , $apply,浅析用法 。
查看>>