Codeforces Round #222 (Div. 1)B:http://codeforces.com/contest/377/problem/B
题意:m个任务,每个任务会有一个复杂度,然后给你n个人,每个人会有一个能力值,一个任务只有被能力值不少于它的人所完成。并且每个人完成任务会有一个费用,这个费用是固定,不论完成多少任务,只要付一次,一个任务只由一个人完成,一个人可以完成多个任务,但是每个人每天只能完成一个任务,现在给以一个总的费用,让你找出在不超过总费用的情况下,去完成这m个任务,并且要求时间短。
题解:想到了贪心,但是没想到要二分天数。最多需要m天去完成,这是显然的,这是在能够完成的前提下。还是那句话,二分一定要有线性关系,这里的线性关系就是,天数越多,任务被完成的可能性越大。对于t天来说,对于任务中复杂度最高的那个任务来说,应该找一个能力水平不小于它,并且费用最少的那个人来完成,这样的费用一定是最少的,那个人花了1天完成了那个任务之后,对于其他任务来说,它肯定是可以完成的,而且他完成后面的任务都是不需要费用的,所以再让他完成t-1个任务。只花了一个任务钱,对于前面的任务来说,要想完成,又要找一个人,让他来完成,重复上面的,直到所有的任务都被完成。实现的时候,可以用一个优先队列来存,然后任务按复杂度从小到大的顺序排序,人按照能力值从小到大排序。然后每一次选择一个当前最复杂的那个任务,把所有比它大=的人都放进队列,然后选择一个最小,去完成前t个任务,然后不断重复,不断二分,最后得到答案。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstring>
  5. #include<queue>
  6. using namespace std;
  7. const int N=1e5+;
  8. struct Node{
  9. int val;
  10. int id;
  11. bool operator<(const Node a)const{
  12. return val<a.val;
  13. }
  14. }task[N];
  15. struct Edge{
  16. int b;
  17. int c;
  18. int id;
  19. bool operator<(const Edge a)const{
  20. return b<a.b;
  21. }
  22. }stu[N];
  23. struct result{
  24. int id;
  25. int cost;
  26. bool operator<(const result a)const{
  27. return cost>a.cost;
  28. }
  29. };
  30. int ans[N],temp[N];
  31. int n,m,s;
  32. bool judge(int t){
  33. int len=m,p=n,tp=s;
  34. priority_queue<result>Q;
  35. while(len>=){
  36. while(p>=&&stu[p].b>=task[len].val){
  37. result aaa;
  38. aaa.cost=stu[p].c;
  39. aaa.id=stu[p].id;
  40. Q.push(aaa);
  41. p--;
  42. }
  43. if(Q.size()==)return false;
  44. result ta=Q.top();
  45. Q.pop();
  46. tp-=ta.cost;
  47. if(tp<)return false;
  48. for(int i=max(,len-t);i<=len;i++)
  49. ans[task[i].id]=ta.id;
  50. len-=t;
  51. }
  52. for(int i=;i<=m;i++)
  53. temp[i]=ans[i];
  54. return true;
  55. }
  56. int main(){
  57. while(~scanf("%d%d%d",&n,&m,&s)){
  58. for(int i=;i<=m;i++){
  59. scanf("%d",&task[i].val);
  60. task[i].id=i;
  61. }
  62. for(int i=;i<=n;i++)
  63. scanf("%d",&stu[i].b);
  64. for(int i=;i<=n;i++){
  65. scanf("%d",&stu[i].c);
  66. stu[i].id=i;
  67. }
  68. sort(task+,task+m+);
  69. sort(stu+,stu+n+);
  70. int minn=-,l=,r=m;
  71. while(l<=r){
  72. int mid=(l+r)/;
  73. if(judge(mid)){
  74. r=mid-;
  75. minn=mid;
  76. }
  77. else l=mid+;
  78. }
  79. if(minn==-)printf("NO\n");
  80. else{
  81. printf("YES\n");
  82. for(int i=;i<=m;i++){
  83. printf("%d ",temp[i]);
  84. }
  85. printf("\n");
  86. }
  87. }
  88. }

Preparing for the Contest的更多相关文章

  1. Codeforces Round #222 (Div. 1) B. Preparing for the Contest 二分+线段树

    B. Preparing for the Contest 题目连接: http://codeforces.com/contest/377/problem/B Description Soon ther ...

  2. 【CF】222 Div.1 B Preparing for the Contest

    这样类似的题目不少,很多都是一堆优化条件求最优解,这个题的策略就是二分+贪心.对时间二分, 对费用采用贪心. /* 377B */ #include <iostream> #include ...

  3. codeforces 377B Preparing for the Contest 二分+优先队列

    题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇 ...

  4. CodeForces 377B---Preparing for the Contest(二分+贪心)

    C - Preparing for the Contest Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d ...

  5. POJ3967Ideal Path[反向bfs 层次图]

    Ideal Path Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 1754   Accepted: 240 Descri ...

  6. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  7. uav 11258 String Partition (DP)

    Problem F - String Partition                                                                         ...

  8. UVA1599-Ideal Path(BFS进阶)

    Problem UVA1599-Ideal Path Time Limit: 3000 mSec Problem Description New labyrinth attraction is ope ...

  9. Codeforces Round #222 (Div. 1) (ABCDE)

    377A Maze 大意: 给定棋盘, 保证初始所有白格连通, 求将$k$个白格变为黑格, 使得白格仍然连通. $dfs$回溯时删除即可. #include <iostream> #inc ...

随机推荐

  1. TREEVIEW节点拖拽

    http://files.cnblogs.com/xe2011/TreeView_Drag_and_Drop.rar       假设把A节点往B节点上拖拽 那么  A 为Node1,B为Node2 ...

  2. strstr和memcmp函数的实现

    #include <stdio.h> #include <stdlib.h> //malloc()函数 typedef unsigned int size_t; size_t ...

  3. MST最小生成树及Prim普鲁姆算法

    MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而 ...

  4. 学习Oracle应该准备的技能

    首先数据库方面的技能:数据库体系结构.基本概念和基本理论.数据库管理.备份.恢复.SQL开发.PLSQL开发.工具的使用等等. 操作系统方面的技能:对Linux/Unix系统应该有相当的基础.理解RA ...

  5. limit-进程句柄限制

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可 ...

  6. The BINARY and VARBINARY Types

    mysql> CREATE TABLE t (c BINARY()); Query OK, rows affected (0.21 sec) mysql> INSERT INTO t SE ...

  7. JS实现一键复制功能

    var copyClick = function (d) { var Url2 = $(d).parent().parent().find("#copy_value"); Url2 ...

  8. CI 笔记4 (easyui 手风琴)

    添加父div标签,和子div标签 <div class="easyui-accordion" data-options="fit:true,border:false ...

  9. oracle中所有关于时间日期的问题总结

    select current_date as 当前会话时间,sysdate as 系统时间, systimestamp as 系统详细时间 from dual;

  10. TextField的文字距左边框的距离偏移

    默认情况下,当向textField输入文字时,文字会紧贴在textField左边框上. 我们可以通过设置textField的leftView,设置一个只有宽度的leftView. 这样还不够,因为默认 ...