好吧,这题做法应该比我的好,好的做法是根据开始的时间排序。
然后开始遍历时间,遇到一个开始的时间,就加上当前的值,遇到结束的时候就减去这个值,在这个过程中的最大值就是题目的解。
自己的做法是看状态总共也就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;
}

被折叠的 条评论
为什么被折叠?



