码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3762 The Bonus Salary!

时间:2014-09-14 23:29:47      阅读:379      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   os   java   ar   for   

The Bonus Salary!

Time Limit: 2000ms
Memory Limit: 65536KB
This problem will be judged on PKU. Original ID: 3762
64-bit integer IO format: %lld      Java class name: Main
 

In order to encourage employees‘ productivity, ACM Company has made a new policy. At the beginning of a period, they give a list of tasks to each employee. In this list, each task is assigned a "productivity score". After the first K days, the employee who gets the highest score will be awarded bonus salary.

Due to the difficulty of tasks, for task i-th:

  • It must be done from hh_Li mm_Li : ss_Li to hh_Ri : mm_Ri : ss_Ri.
  • This range of time is estimated very strictly so that anyone must use all of this time to finish the task.

 

Moreover, at a moment, each employee can only do at most one task. And as soon as he finishes a task, he can start doing another one immediately.

XYY is very hard-working. Unfortunately, he‘s never got the award. Thus, he asks you for some optimal strategy. That means, with a given list of tasks, which tasks he should do in the first K days to maximize the total productivity score. Notice that one task can be done at most once.

 

Input

The first line contains 2 integers N and K (1 ≤ N ≤ 2000, 0 ≤ K ≤ 100), indicating the number of tasks and days respectively. This is followed by N lines; each line has the following format:

hh_Li:mm_Li:ss_Li hh_Ri:mm_Ri:ss_Ri w

Which means, the i-th task must be done from hh_Li mm_Li : ss_Li to hh_Ri : mm_Ri : ss_Ri and its productivity score is w. (0 ≤hh_Lihh_Ri ≤ 23, 0 ≤mm_Limm_Riss_Liss_Ri≤ 59, 1 ≤ w ≤ 10000). We use exactly 2 digits (possibly with a leading zero) to represent hhmm and ss. It is guaranteed that the moment hh_Ri : mm_Ri : ss_Ri is strictly later thanhh_Li mm_Li : ss_Li. 

 

Output

The output only contains a nonnegative integer --- the maximum total productivity score.

 

Sample Input

5 2
09:00:00 09:30:00 2
09:40:00 10:00:00 3
09:29:00 09:59:00 10
09:30:00 23:59:59 4
07:00:00 09:31:00 3

Sample Output

16

Hint

The optimal strategy is:
Day1: Task1, Task 4
Day2: Task 3
The total productivity score is 2 + 4 + 10 = 16.

 

解题:最小费用最大流。离散化时间点。

 

bubuko.com,布布扣
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <climits>
  7 #include <vector>
  8 #include <queue>
  9 #include <cstdlib>
 10 #include <string>
 11 #include <set>
 12 #include <stack>
 13 #define LL long long
 14 #define pii pair<int,int>
 15 #define INF 0x3f3f3f3f
 16 using namespace std;
 17 const int maxn = 5010;
 18 struct arc{
 19     int v,w,f,next;
 20     arc(int x = 0,int y = 0,int z = 0,int nxt = 0){
 21         v = x;
 22         w = y;
 23         f = z;
 24         next = nxt;
 25     }
 26 };
 27 arc e[1000000];
 28 int head[maxn],d[maxn],p[maxn],tot,S,T;
 29 bool in[maxn];
 30 int n,m,lisan[maxn<<4],cnt,x[maxn],y[maxn],sc[maxn];
 31 void add(int u,int v,int w,int f){
 32     e[tot] = arc(v,w,f,head[u]);
 33     head[u] = tot++;
 34     e[tot] = arc(u,-w,0,head[v]);
 35     head[v] = tot++;
 36 }
 37 queue<int>q;
 38 bool spfa(){
 39     for(int i = S; i <= T; i++){
 40         d[i] = INF;
 41         p[i] = -1;
 42         in[i] = false;
 43     }
 44     while(!q.empty()) q.pop();
 45     d[S] = 0;
 46     in[S] = true;
 47     q.push(S);
 48     while(!q.empty()){
 49         int u = q.front();
 50         q.pop();
 51         in[u] = false;
 52         for(int i = head[u]; ~i; i = e[i].next){
 53             if(e[i].f > 0 && d[e[i].v] > d[u] + e[i].w){
 54                 d[e[i].v] = d[u] + e[i].w;
 55                 p[e[i].v] = i;
 56                 if(!in[e[i].v]){
 57                     in[e[i].v] = true;
 58                     q.push(e[i].v);
 59                 }
 60             }
 61         }
 62     }
 63     return p[T] > -1;
 64 }
 65 int solve(){
 66     int tmp = 0,minV;
 67     while(spfa()){
 68         minV = INF;
 69         for(int i = p[T]; ~i; i = p[e[i^1].v])
 70             minV = min(minV,e[i].f);
 71         for(int i = p[T]; ~i; i = p[e[i^1].v]){
 72             tmp += minV*e[i].w;
 73             e[i].f -= minV;
 74             e[i^1].f += minV;
 75         }
 76     }
 77     return tmp;
 78 }
 79 int main(){
 80     int hh,mm,ss;
 81     while(~scanf("%d %d",&n,&m)){
 82         tot = cnt = 0;
 83         memset(head,-1,sizeof(head));
 84         for(int i = 0; i < n; i++){
 85             scanf("%d:%d:%d",&hh,&mm,&ss);
 86             x[i] = hh*3600 + mm*60 + ss;
 87             lisan[cnt++] = x[i];
 88             scanf("%d:%d:%d",&hh,&mm,&ss);
 89             y[i] = hh*3600 + mm*60 + ss;
 90             lisan[cnt++] = y[i];
 91             scanf("%d",sc+i);
 92         }
 93         sort(lisan,lisan+cnt);
 94         int cnt1 = 1;
 95         for(int i = 1; i < cnt; i++)
 96         if(lisan[i] != lisan[cnt1-1]) lisan[cnt1++] = lisan[i];
 97         cnt = cnt1;
 98         S = 0;
 99         T = cnt;
100         for(int i = 0; i < cnt; i++) add(i,i+1,0,m);
101         for(int i = 0; i < n; i++){
102             int tx = lower_bound(lisan,lisan+cnt,x[i]) - lisan;
103             int ty = lower_bound(lisan,lisan+cnt,y[i]) - lisan;
104             add(tx,ty,-sc[i],1);
105         }
106         printf("%d\n",-solve());
107     }
108     return 0;
109 }
110 /*
111 5 2
112 09:00:00 09:30:00 2
113 09:40:00 10:00:00 3
114 09:29:00 09:59:00 10
115 09:30:00 23:59:59 4
116 07:00:00 09:31:00 3
117 */
View Code

 

POJ 3762 The Bonus Salary!

标签:style   blog   http   color   io   os   java   ar   for   

原文地址:http://www.cnblogs.com/crackpotisback/p/3971910.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!