题目描述
在《 Harry Potter and the Chamber of Secrets》中, Ron 的魔杖因为坐他老爸的 Flying
Car 撞到了打人柳,不幸被打断了。从此之后,他的魔杖的魔力就大大减少,甚至没办法执行他
施的魔咒,这为 Ron 带来了不少的烦恼。这天上魔药课, Snape 要他们每人配置一种魔药(不一
定是一样的), Ron 因为魔杖的问题,不能完成这个任务,他请 Harry 在魔药课上(自然是躲过了
Snape 的检查)帮他配置。现在 Harry 面前有两个坩埚,有许多种药材要放进坩埚里,但坩埚的
能力有限,无法同时配置所有的药材。一个坩埚相同时间内只能加工一种药材,但是不一定每
一种药材都要加进坩埚里。加工每种药材都有必须在一个起始时间和结束时间内完成(起始时
间所在的那一刻和结束时间所在的那一刻也算在完成时间内),每种药材都有一个加工后的药
效。现在要求的就是 Harry 可以得到最大的药效。
5 1
3 -2
注意事项:同一坩埚加工两种药材之间的时间间隔至少为 1, 也就是说用 1 个单位时间清洗坩
埚,如果不清洗就加工下一种药材的话,将会影响到药效的哦!
输入
输入文件的第一行有 2 个整数,一节魔药课的 t( 1≤t≤500)和药材数 n( 1≤n≤100)。
第 2 行到 n+1 行中每行有 3 个数字,分别为加工第 i 种药材的起始时间 t1、结束时间 t2、( 1≤t1<t2≤t)和药效 w( 1≤w≤100)。
输出
输出文件只有一行,只输出一个正整数,即为最大药效。
f[i][j][k]表示第i个药材时第一个坩埚最后一个药材为j,第二个坩埚最后一个药材为k时的最大药效。
1 #include <algorithm> 2 #include <cstdio> 3 4 struct med{ 5 int t1,t2,w; 6 }a[101]; 7 8 int t,n,ans,f[101][101][101]; 9 #define max(x,y) (x>y?x:y) 10 11 bool cmp(med x,med y){ 12 if(x.t1==y.t1)return x.t2<y.t2; 13 return x.t1<y.t1; 14 } 15 16 int main(void){ 17 scanf("%d%d",&t,&n); 18 for(int i=1;i<=n;++i) 19 scanf("%d%d%d",&a[i].t1,&a[i].t2,&a[i].w); 20 std::sort(a+1,a+n+1,cmp); 21 for(int i=1;i<=n;++i){ 22 for(int j=0;j<i;++j){ 23 for(int k=0;k<i;++k){ 24 f[i][j][k]=f[i-1][j][k]; 25 if(a[i].t1>a[j].t2)f[i][i][k]=max(f[i][i][k],f[i-1][j][k]+a[i].w); 26 if(a[i].t1>a[k].t2)f[i][j][i]=max(f[i][j][i],f[i-1][j][k]+a[i].w); 27 ans=max(ans,max(f[i][i][k],f[i][j][i])); 28 } 29 } 30 } 31 printf("%d",ans); 32 }
原文地址:https://www.cnblogs.com/gzh01/p/9379703.html
时间: 2024-11-05 17:33:48