Tom的烦恼
(tom.pas/in/out)
Problem
Tom是一个非常有创业精神的人,由于大学学的是汽车制造专业,所以毕业后他用有限的资金开了一家汽车零件加工厂,专门为汽车制造商制造零件。由于资金有限,他只能先购买一台加工机器。现在他却遇到了麻烦,多家汽车制造商需要他加工一些不同零件(由于厂家和零件不同,所以给的加工费也不同),而且不同厂家对于不同零件的加工时间要求不同(有些加工时间要求甚至是冲突的,但开始和结束时间相同不算冲突)。
Tom当然希望能把所有的零件都加工完,以得到更多的加工费,但当一些零件的加工时间要求有冲突时,在某个时间内他只能选择某种零件加工(因为他只有一台机器),为了赚得尽量多的加工费,Tom不知如何进行取舍。
现在请你帮Tom设计一个程序,合理选择部分(或全部)零件进行加工,使得得到最大的加工费。
Input
第一行是一个整数n(n<=30000),表示共有n个零件须加工。
接下来的n行中,每行有3个整数,分别表示每个零件加工的时间要求。
第一个表示开始时间,第二个表示该零件加工的结束时间,第三个表示加工该零件可以得到的加工费。
注:数据中的每个数值不会超过100000.
Output
输出一个整数,表示Tom可以得到的最大加工费。
Sample Input
3
1 3 10
4 6 20
2 5 25
Sample Output
30
这道题的模型已经做到想吐了。无限重复地考,虽然确实是一道好题。。。
F[start[i]] = max(F[start[i]+1],F[end[i]]+val[i])
#include <cstdio>
#include <algorithm>
using std::max;
struct node
{
long ind;
long val;
node* nxt;
};
node* head[100010];
long f[100010];
void insert(long s,long t,long v)
{
node* nn = new node;
nn -> ind = t;
nn -> val = v;
nn -> nxt = head[s];
head[s] = nn;
}
long getint()
{
long rs=0;bool sgn=1;char tmp;
do tmp=getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){tmp=getchar();sgn=0;}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}
int main()
{
freopen("tom.in","r",stdin);
freopen("tom.out","w",stdout);
long n = getint();
long maxt = 0;
for (long i=1;i<n+1;i++)
{
long s = getint();
long t = getint();
long v = getint();
insert(s,t,v);
maxt = max(maxt,t);
}
for (long s=maxt;s>0;s--)
{
f[s] = f[s+1];
for (node* tt=head[s];tt;tt=tt->nxt)
{
long t = tt->ind;
long v = tt->val;
f[s] = max(f[s],f[t]+v);
}
}
printf("%ld",f[1]);
return 0;
}