1985: 即将到来的新生赛

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 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;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值