【题解】Tom的烦恼

题目描述

          Tom是一个非常有创业精神的人,由于大学学的是汽车制造专业,所以毕业后他用有限的资金开了一家汽车零件加工厂,专门为汽车制造商制造零件。由于资金有限,他只能先购买一台加工机器。现在他却遇到了麻烦,多家汽车制造商需要他加工一些不同零件(由于厂家和零件不同,所以给的加工费也不同),而且不同厂家对于不同零件的加工时间要求不同(有些加工时间要求甚至是冲突的,但开始和结束时间相同不算冲突)。

         Tom当然希望能把所有的零件都加工完,以得到更多的加工费,但当一些零件的加工时间要求有冲突时,在某个时间内他只能选择某种零件加工(因为他只有一台机器),为了赚得尽量多的加工费,Tom不知如何进行取舍。

        现在请你帮Tom设计一个程序,合理选择部分(或全部)零件进行加工,使得得到最大的加工费。

 

输入格式

        第一行,一个整数n(n≤10000),表示共有n个零件须加工。

        接下来的n行中,每行有3个整数,分别表示每个零,加工的时间要求。

        第一个表示开始时间,第二个表示该零件加工的结束时间,第三个表示加工该零件可以得到的加工费。

        注:数据中的每个数值不会超过100000。

输出格式

        一行,一个整数,表示Tom可以得到的最大加工费。

 

输入样例

3

1 3 10

2 5 25

4 6 20

输出样例

30

 

题解

         一个优化技巧:按照加工费排序,然后从最大的开始枚举判断是否能进行状态转,可以的转移完直接break即可。

#include <iostream>
#include <algorithm>
#define MAXN 10001

using namespace std;

int n;
struct node
{
    int s, t;
    int val;
}a[MAXN];
bool cmp(node a, node b)
{
    if(a.t != b.t) return a.t < b.t;
    return a.s < b.s;
}
int f[MAXN];

int main()
{
    cin >> n;
    for(register int i = 1; i <= n; i++)
    {
        cin >> a[i].s >> a[i].t >> a[i].val;
    }
    sort(a + 1, a + n + 1, cmp);
    for(register int i = 1; i <= n; i++)
    {
        f[i] = f[i - 1];
        for(register int j = i - 1; j >= 0; j--)
        {
            if(a[j].t > a[i].s) continue;
            f[i] = max(f[i], f[j] + a[i].val);
            break;
        }
    }
    cout << f[n]; 
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10847941.html
tom
今日推荐