/*求助帖*/
旅游咨询家(baffle)
(测试点数:10 题目总分值:100 时间限制:3 秒 内存限制:128 MB)
【问题描述】
吕优是一位职业旅游咨询家,平常从世界各地到他这儿来做咨询的人很多。这{yt},吕优共收到 n 位顾客的咨询请求,每位顾客的请求就是他将在某一段时间内向吕优咨询,并且吕优根据他咨询的内容,计算出这位顾客应付多少报酬。吕优把今天算作是第 0 天,那么,第i位顾客的请求就是在第ai天到第bi天这段时间内进行咨询(包括第 ai天和第 bi天),这次咨询吕优可以获得 ci的报酬。但是,吕优在{yt}之内只能接受对一位顾客的咨询,并且一旦接受了一位顾客的请求, 在这位顾客请求的时间段内都必须为他服务, 否则他得不到报酬。
吕优很有经济头脑,他无时无刻不在考虑怎样获得最多的报酬,这个复杂的优化问题使他非常困惑。
使他更困惑的是:根据他的经验,他知道在这 n 位顾客中,有一位顾客可能会失约,但是,起初他并不知道哪位顾客会失约,直到该顾客请求的时间段开始时他才知道。于是,吕优希望做出一个决策,使得在最坏情况下他获得的报酬最多。
吕优告诉顾客他是否接受顾客的请求是在该顾客提出的咨询时间段开始的当天,而顾客也是在吕优告之其请求被接受后,才对吕优回应他会不会失约。最开始,吕优选择了一些他接受的顾客,如果当前没有顾客失约,他就按照他的选择接受顾客的咨询请求,一旦发现某位顾客失约,他就可以断定,除了这位顾客外,不会有其他的顾客失约,那么就从那天起,做出新的{zy}决策,使他获得的报酬最多(如果第i 位顾客在 ai天失约,那么第ai天吕优就可开始选择接受其他的顾客请求)。当然,吕优需要考虑在最坏情况下,他最多能获得多少报酬。你只需告诉吕优最开始的{zy}选择,以及在该选择下最坏情况能获得的最多报酬。
【输入格式】(baffle.in)
文件中包含多组数据,对每组数据:输入的第 1 行为一个正整数 n(1<=n<=10000),表示共收到 n 位顾客的咨询请求。接下来的 n 行,第 i+1 行有3个整数 ai、bi和 ci,表示第 i 位顾客请求从第 ai天到第 bi天进行咨询,如果吕优接受这个咨询请求,那么他将获得ci的报酬(1<=ai<=bi<=10^6,1<=ci<=10^5)。输入以 n=0 作为数据的结束标志,对此并不需要相应的输出。并且数据的组数不会超过 20。
【输出格式】(baffle.out)
对每组输入数据包含2行输出, {dy}行输出吕优最开始选择接受的顾客的序号, 其格式为:m k1 k2 …… km,其中,m表示选择接受的顾客的数量,k1到km表示所选择顾客的编号(从1到n),并按照时间的先后顺序排列。显然,这m位顾客的咨询时间不会发生冲突。第二行为一个整数,表示在最坏情况下吕优能获得的最多报酬。
【输入输出样例】
baffle.in
4
1 3 200
4 5 100
4 5 50
2 6 400
0
baffle.out
2 1 2
250
【输入输出样例说明】
最开始选择两位顾客,即顾客 1 和顾客 2。在这种选择下,有 3 种情况可能会发生:
(a)、没有人失约,这时吕优获得的报酬就是 300。
(b)、顾客 1 失约,这时,吕优在第 1 天就得知顾客 1 失约,那么后面的顾客 2、顾客 3 和顾客 4 都不会失约, 他从当天起做出{zy}选择, 即选择顾客 4。 这种情况下他获得的报酬是 400。
(c)、顾客 2 失约,这时,吕优在第 4 天才得知顾客 2 失约,那么他还可以选择接受顾客 3 的请求。这种情况下他获得的报酬是 250。
综合上面的情况,在这种选择下最坏情况获得的报酬是 250,这是{zy}的选择。
否则如果最开始只选择顾客 4,若顾客 4 失约,则他在以后就只能选择顾客 2,这时获得的报酬只有 100。
如果最开始选择顾客 1 和顾客 3,那么最坏情况是所有顾客都不失约,这时获得的报酬也是 250,当然这也是{zy}的选择。