配置魔药(medic.pas/c/cpp)
2011-08-30 19:40
302 查看
配置魔药
(medic.pas/c/cpp)
【问题描述】
在《Harry Potter and the Chamber of Secrets》中,Ron的魔杖因为坐他老爸的Flying Car撞到了打人柳,不幸被打断了,从此之后,他的魔杖的魔力就大大减少,甚至没办法执行他施的魔咒,这为Ron带来了不少的烦恼。这天上魔药课,Snape要他们每人配置一种魔药(不一定是一样的),Ron因为魔杖的问题,不能完成这个任务,他请Harry在魔药课上(自然是躲过了Snape的检查)帮他配置。现在Harry面前有两个坩埚,有许多种药材要放进坩埚里,但坩埚的能力有限,无法同时配置所有的药材。一个坩埚相同时间内只能加工一种药材,但是不一定每一种药材都要加进坩埚里。加工每种药材都有必须在一个起始时间和结束时间内完成(起始时间所在的那一刻和结束时间所在的那一刻也算在完成时间内),每种药材都有一个加工后的药效。现在要求的就是Harry可以得到最大的药效。
【输入文件】(medic.in)
输入文件的第一行有2个整数,一节魔药课的t(1≤t<≤500)和药材数n(1≤n≤100)。
输入文件第2行到n+1行中每行有3个数字,分别为加工第i种药材的起始时间t1、结束时间t2、(1≤t1≤t2≤t)和药效w(1≤w≤100)。
【输出文件】(medic.out)
输出文件medic.out只有一行,只输出一个正整数,即为最大药效。
【输入样例】
7 4
1 2 10
4 7 20
1 3 2
3 7 3
【输出样例】
35
【注释】
本题的样例是这样实现的:第一个坩埚放第1、4种药材,第二个坩埚放第2、3种药材。这样最大的药效就为10+20+2+3=35。
如图,数字为时间轴。
![](http://hi.csdn.net/attachment/201108/30/0_13147043996gJt.gif)
【数据规模】
对于30%的数据
1<=t<=500
1<=n<=15
1<=w<=100
1<=t1<=t2<=t
对于100%的数据
1<=t<=500
1<=n<=100
1<=w<=100
1<=t1<=t2<=t
=========================
f[i,j,k]表示前i个药.1坩埚j时刻,2坩埚k时刻所能取得的最大价值..
==========================
(medic.pas/c/cpp)
【问题描述】
在《Harry Potter and the Chamber of Secrets》中,Ron的魔杖因为坐他老爸的Flying Car撞到了打人柳,不幸被打断了,从此之后,他的魔杖的魔力就大大减少,甚至没办法执行他施的魔咒,这为Ron带来了不少的烦恼。这天上魔药课,Snape要他们每人配置一种魔药(不一定是一样的),Ron因为魔杖的问题,不能完成这个任务,他请Harry在魔药课上(自然是躲过了Snape的检查)帮他配置。现在Harry面前有两个坩埚,有许多种药材要放进坩埚里,但坩埚的能力有限,无法同时配置所有的药材。一个坩埚相同时间内只能加工一种药材,但是不一定每一种药材都要加进坩埚里。加工每种药材都有必须在一个起始时间和结束时间内完成(起始时间所在的那一刻和结束时间所在的那一刻也算在完成时间内),每种药材都有一个加工后的药效。现在要求的就是Harry可以得到最大的药效。
【输入文件】(medic.in)
输入文件的第一行有2个整数,一节魔药课的t(1≤t<≤500)和药材数n(1≤n≤100)。
输入文件第2行到n+1行中每行有3个数字,分别为加工第i种药材的起始时间t1、结束时间t2、(1≤t1≤t2≤t)和药效w(1≤w≤100)。
【输出文件】(medic.out)
输出文件medic.out只有一行,只输出一个正整数,即为最大药效。
【输入样例】
7 4
1 2 10
4 7 20
1 3 2
3 7 3
【输出样例】
35
【注释】
本题的样例是这样实现的:第一个坩埚放第1、4种药材,第二个坩埚放第2、3种药材。这样最大的药效就为10+20+2+3=35。
如图,数字为时间轴。
![](http://hi.csdn.net/attachment/201108/30/0_13147043996gJt.gif)
【数据规模】
对于30%的数据
1<=t<=500
1<=n<=15
1<=w<=100
1<=t1<=t2<=t
对于100%的数据
1<=t<=500
1<=n<=100
1<=w<=100
1<=t1<=t2<=t
=========================
f[i,j,k]表示前i个药.1坩埚j时刻,2坩埚k时刻所能取得的最大价值..
==========================
type re=record s,e,w:longint; end; var t,n:longint; med:array[1..100]of re; f:array[0..100,0..500,0..500]of longint; procedure init; begin assign(input,'medic.in'); assign(output,'medic.out'); reset(input); rewrite(output); end; procedure terminate; begin close(input); close(output); halt; end; procedure qsort(s,t:longint); var i,j:longint; x:longint; tem:re; begin i:=s; j:=t; x:=med[(i+j)shr 1].e; repeat while x<med[j].e do dec(j); while x>med[i].e do inc(i); if i<=j then begin tem:=med[i]; med[i]:=med[j]; med[j]:=tem; inc(i); dec(j); end; until i>j; if i<t then qsort(i,t); if j>s then qsort(s,j); end; function max(a,b:longint):longint; begin if a>b then exit(a); exit(b); end; procedure main; var i,j,k:longint; begin readln(t,n); for i:=1 to n do readln(med[i].s,med[i].e,med[i].w); qsort(1,n); fillchar(f,sizeof(f),0); for i:=1 to n do for j:=0 to t do for k:=0 to t do begin f[i,j,k]:=f[i-1,j,k]; if j>=med[i].e then f[i,j,k]:=max(f[i-1,med[i].s-1,k]+med[i].w,f[i,j,k]); if k>=med[i].e then f[i,j,k]:=max(f[i-1,j,med[i].s-1]+med[i].w,f[i,j,k]); end; writeln(f[n,t,t]); end; begin init; main; terminate; end.
相关文章推荐
- 采药(medic.pas/c/cpp)
- 【动态规划】Tom的烦恼 tom.pas/c/cpp/in/out
- 奖金(Reward.pas/cpp)
- xp 下给VIM配置tagList时不能解析.cpp
- 【记忆化】滑雪(ski.pas/c/cpp)
- 【打表】Round Numbers rndnum.pas/c/cpp
- 【模拟】【栈】外星密码 password.pas/c/cpp
- 【斐波那契的一个形式】古代人的难题( puzzle.pas/c/cpp)
- YZOI Easy Round 2_化简(simplify.c/cpp/pas)
- 快速配置你的VIM_for_CPP_IDE
- 多多看DVD(加强版)(watchdvd.pas/c/cpp)
- 【最大子区间和】旅游路线(travel.pas/c/cpp)
- mm.cpp/c/pas
- vim +ctags +taglist +global+cppcomplete 配置
- 2012_p4 文化之旅 (culture.cpp/c/pas)
- 越越的交通指挥系统 (traffic.pas/c/cpp)
- 试题二:最接近神的人(sophist/pas/c/cpp) (逆序对)
- 【记忆化】能量项链(energy.pas/c/cpp)
- 【模拟 计算几何】连线游戏 lines.pas/c/cpp