hdu 4883

来源:互联网 发布:淘宝确认收货几天 编辑:程序博客网 时间:2024/05/25 23:58

   好吧,这题做法应该比我的好,好的做法是根据开始的时间排序。

  然后开始遍历时间,遇到一个开始的时间,就加上当前的值,遇到结束的时候就减去这个值,在这个过程中的最大值就是题目的解。

  自己的做法是看状态总共也就24*60种,就自己找到开始时间和结束时间,在这个期间的每个时刻加上当前值,然后找出值最大的时刻。

#include "stdio.h"#include "string.h"#include "math.h"#include <string>#include <queue>#include <stack>#include <vector>#include <map>#include <algorithm>#include <iostream>using namespace std;#define MAX 1#define max(a,b) a > b ? a : b#define min(a,b) a < b ? a : b#define abs(a)  a < 0 ? a : (-a)#define Mem(a,b) memset(a,b,sizeof(a))int Mod = 1000000007;double pi = acos(-1.0);double eps = 1e-6;typedef struct{int f,t,w,next;}Edge;Edge edge[MAX];int head[MAX];int kNum;int T,n;int dp[1500];char s1[10], s2[10];void addEdge(int f, int t, int w){edge[kNum].f = f;edge[kNum].t = t;edge[kNum].w = w;edge[kNum].next = head[f];head[f] = kNum ++;}void handle(int val){int s = 0, t = 0, v = 0;for(int i = 0; s1[i] != 0; i ++){if( s1[i] == ':' ){s = v;v = 0;continue;}v = v * 10 + ( s1[i] - '0' );}s = s * 60 + v;v = 0;for(int i = 0; s2[i] != 0; i ++){if( s2[i] == ':' ){t = v;v = 0;continue;}v = v * 10 + ( s2[i] - '0' );}t = t * 60 + v;for(int i = s; i < t; i ++){dp[i] += val;}}void solve(){Mem(dp, 0);int val;for(int i = 0; i < n; i ++){scanf("%d %s %s",&val, s1, s2);handle(val);}int ans = dp[0];for(int i = 0; i < 24 * 60; i ++){if( ans < dp[i] )ans = dp[i];}printf("%d\n",ans);}int main(){//freopen("d:\\test.txt", "r", stdin);while(cin>>T){while( T-- ){cin>>n;solve();}}return 0;}

0 0
原创粉丝点击