1985: 即将到来的新生赛
Description
新生赛马上就要到来了。为了举办这次比赛,学校也是大费苦心。由于时间紧迫,要准备的事情太多,人员安排也是很伤脑子。身为一个聪明的acmer,这点小事对你来说应该是So easy!
距离新生赛开始剩余100个小时,现在还剩余m项任务。每个任务都有开始时间,结束时间和收益。现在想知道怎么安排这些任务使人员安排的效率最大(收益最高)。
注:同一时间只能做一个任务, 一个任务结束后可以立马开始另外一个任务,也就是说下一个任务的开始时间可以等于正在做的任务的结束时间。由于有些任务是有时间上的冲突, 所以这些任务是选作,可以不用全部完成。
距离新生赛开始剩余100个小时,现在还剩余m项任务。每个任务都有开始时间,结束时间和收益。现在想知道怎么安排这些任务使人员安排的效率最大(收益最高)。
注:同一时间只能做一个任务, 一个任务结束后可以立马开始另外一个任务,也就是说下一个任务的开始时间可以等于正在做的任务的结束时间。由于有些任务是有时间上的冲突, 所以这些任务是选作,可以不用全部完成。
Input
输入第一行为整数T,表示有T组测试数据。
每组测试数据第一行为一个整数m,表示剩余任务。随后m行,每行三个整数b,e和v分别表示其中一项活动的开始时间,结束时间和收益。(0<=b < e<=100 ,0<=v<=10000,1<=m<=20)
每组测试数据第一行为一个整数m,表示剩余任务。随后m行,每行三个整数b,e和v分别表示其中一项活动的开始时间,结束时间和收益。(0<=b < e<=100 ,0<=v<=10000,1<=m<=20)
Output
输出最高收益。
Sample Input
1
4
0 5 1
0
3 7 14
5 9 7
6 9 8
Sample Output
18
本题思路:第一:sort + 结构体,写出框架;
第二:(找最高收益的子串,zz博主不熟练)
用贪心解决不了这种最优解问题并且有多个适用子串的时候,采用dp并灵活.灵活套用下列模板;
模板:
for ( i=0 ; i<m ; i++)
{
......
for ( j=0 ; j<i ; j++)
{
if ( s[i].a >= s[j].b )
{
......
}
}
... = max (...,...);
}
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
int dp[100];
struct node
{
int a;
int b;
int c;
}s[300];
bool cmp(node x,node y)
{
if(x.b!=y.b)
return x.b<y.b;
else return x.a<y.a;
}
int main()
{
int t,m,k,n,i,j,mas,ans;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
mas=0;
scanf("%d",&m);
for(i=0;i<m;i++)
{
scanf("%d %d %d",&s[i].a,&s[i].b,&s[i].c);
}
sort(s,s+m,cmp);
for(i=0;i<m;i++)
{
ans=0;
dp[i]=s[i].c;
for(j=0;j<i;j++)
{
if(s[i].a>=s[j].b)
{
ans=max(ans,dp[j]);
}
}
dp[i]+=ans;
mas=max(mas,dp[i]);
}
printf("%d\n",mas);
}
return 0;
}