1985: 即将到来的新生赛

来源:互联网 发布:淘宝四钻店铺转让 编辑:程序博客网 时间:2024/04/30 08:48

1985: 即将到来的新生赛

Description

新生赛马上就要到来了。为了举办这次比赛,学校也是大费苦心。由于时间紧迫,要准备的事情太多,人员安排也是很伤脑子。身为一个聪明的acmer,这点小事对你来说应该是So easy!
距离新生赛开始剩余100个小时,现在还剩余m项任务。每个任务都有开始时间,结束时间和收益。现在想知道怎么安排这些任务使人员安排的效率最大(收益最高)。
注:同一时间只能做一个任务, 一个任务结束后可以立马开始另外一个任务,也就是说下一个任务的开始时间可以等于正在做的任务的结束时间。由于有些任务是有时间上的冲突, 所以这些任务是选作,可以不用全部完成。

Input

输入第一行为整数T,表示有T组测试数据。
每组测试数据第一行为一个整数m,表示剩余任务。随后m行,每行三个整数b,e和v分别表示其中一项活动的开始时间,结束时间和收益。(0<=b < e<=100 ,0<=v<=10000,1<=m<=20)

Output

输出最高收益。

Sample Input

1
4
0 5 10
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;}

0 0