题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4864

解题报告:有n台机器用来完成m个任务,每个任务有一个难度值和一个需要完成的时间,每台机器有一个可以工作的最长时间和一个可以完成的任务的难度的最大值,

一台机器能完成一个任务的条件是这台机器的最长工作时间和能完成任务的难度值必须都大于等于这个任务,而且一台机器最多完成一个任务,假设一个任务的时间为t,难度值为x,那么完成这个任务可以赚到的钱 money = 500 * t + 2 * x; 现在要你求最多可以完成多少个任务,而且要求能赚的钱最多。

贪心的题,难度值对能赚的钱的多少影响较小,所以将所有任务按时间从大到小排序,时间相同的按照难度值从大到小排序,然后遍历每个任务,对于每个任务,我们首先应该找到符合这个任务的时间的机器,其次机器的难度值要最小,然后还有就是尽量做时间多的任务,很显然,时间对钱的多少影响最大。

现在的问题就是怎样在最短时间内找到时间符合同时机器难度值最小的机器来完成这个任务,因为n和m的范围都是10^5,所以直接暴力明显是不行的。

我建了一个多集multiset邻接表mt来存储机器,mt[i][j]的含义是难度值为x的机器的时间是mt[i][j],然后,用多集的原因是多集会自动对元素进行排序,而且更重要的是它有一个二分查找的函数lower_bound( x ),这个函数的功能是在这个多集里面找到最小的大于等于x的元素的位置,如果没有,则返回尾指针。有了这个就快了,可以从难度值满足的多集处开始查找,然后二分找到有没有时间上满足的。然后整个是时间复杂度是  m * 100 * log2(1000);

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<set>
using namespace std;
typedef __int64 INT;
const int maxn = +; struct node
{
int x,y;
}task[maxn];
multiset<int> mt[]; bool cmp(node a,node b)
{
if(a.x == b.x)
return a.y > b.y;
return a.x > b.x;
} int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int a,b;
for(int i = ;i <= ;++i)
mt[i].clear();
for(int i = ;i < n;++i)
{
scanf("%d%d",&a,&b);
mt[b].insert(a);
}
for(int i = ;i < m;++i)
scanf("%d%d",&task[i].x,&task[i].y);
sort(task,task+m,cmp);
INT num = ,tot = ;
for(int i = ;i < m;++i)
{
int p = -;
multiset<int>::iterator iter;
for(int j = task[i].y;j <= ;++j) //mt[j]集中数的含义是所有难度为j的机器的时间
{
iter = mt[j].lower_bound(task[i].x); //lower_bound()用二分查找找到最小的大于或等于task[i].x的数的位置
if(iter != mt[j].end())
{
p = j;
break;
}
}
if(p != -)
{
num++;
tot += ( * task[i].x + * task[i].y);
mt[p].erase(iter);
}
}
printf("%I64d %I64d\n",num,tot);
}
return ;
}

最新文章

  1. Bootstrap相关资料
  2. hibernate笔记--单(双)向的多对多映射关系
  3. Ajax深入学习
  4. 题目1003:A+B ---c_str(),atoi()函数的使用;remove , erase函数的使用
  5. NOIP算法总结
  6. _blank开新窗体不符合标准?
  7. js的事件属性方法一览表
  8. effective c++ 条款10 handle assignment to self operator =
  9. 文本挖掘预处理之TF-IDF
  10. TensorFlow框架(5)之机器学习实践
  11. spark-shell 显示乱码
  12. 偶遇vue-awesome-swiper的坑
  13. 【Python】解析Python中的条件语句和循环语句
  14. Oracle 26表空间的管理
  15. BZOJ2434[Noi2011]阿狸的打字机——AC自动机+dfs序+树状数组
  16. ORACLE环境变量定义.md
  17. 02-03:springboot 整合listener
  18. Android WebView漏洞(转)
  19. 【python学习-5】面向对象的python
  20. 『Scrapy』终端调用&amp;选择器方法

热门文章

  1. 如何自学 Android 编程?
  2. OOP多态和继承要点
  3. 程序员&quot;青春饭&quot;问题之我见
  4. Android图片浏览器之缩略图
  5. GnuDIP制作动态域名服务器(DDNS Server)_转载http://blog.sina.com.cn/s/blog_4d4c23530100rlfj.html
  6. SQL注入备忘单
  7. Lucene 4.7 --实现搜索
  8. sdibt 1244 烦人的幻灯片
  9. POJ1836Alignment(LCA)
  10. POJ1703Find them, Catch them