性感
D
a
w
n
Dawn
Dawn 在线日更
题面
康康题面 (算法标签 过后,这肯定是
d
p
dp
dp啊
用
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]表示在第
i
i
i个垃圾 高度为
j
j
j时的血量
这题感觉顺推比较得劲
分为以下两种情况:
1.
1.
1.吃辣鸡:
d
p
[
i
+
1
]
[
j
+
a
[
i
+
1
]
.
h
]
=
m
a
x
(
d
p
[
i
+
1
]
[
j
+
a
[
i
+
1
]
.
h
]
,
d
p
[
i
]
[
j
]
−
a
[
i
+
1
]
.
t
+
a
[
i
]
.
t
)
dp[i+1][j+a[i+1].h]=max(dp[i+1][j+a[i+1].h],dp[i][j]-a[i+1].t+a[i].t)
dp[i+1][j+a[i+1].h]=max(dp[i+1][j+a[i+1].h],dp[i][j]−a[i+1].t+a[i].t)
2.
2.
2.堆垃圾:
d
p
[
i
+
1
]
[
j
]
=
m
a
x
(
d
p
[
i
+
1
]
[
j
]
,
d
p
[
i
]
[
j
]
−
a
[
i
+
1
]
.
t
+
a
[
i
]
.
t
+
a
[
i
+
1
]
.
f
)
dp[i+1][j]=max(dp[i+1][j],dp[i][j]-a[i+1].t+a[i].t+a[i+1].f)
dp[i+1][j]=max(dp[i+1][j],dp[i][j]−a[i+1].t+a[i].t+a[i+1].f)
一些代码细节:
1.
1.
1.在求
d
p
dp
dp的过程中 如果奶牛能撑到下一个垃圾垫过去并且垫过去直接出去时 直接输出并结束程序
2.
2.
2.如果求完
d
p
dp
dp后 程序还没结束 说明出不去 那么就重新跑一遍 一直吃辣鸡 康康能挺多长时间
好像挺水的 但是这特坑点特别多:
1.
1.
1.初始值
d
p
[
0
]
[
0
]
dp[0][0]
dp[0][0]要设为
10
10
10
2.
2.
2.当奶牛的血量为
0
0
0时 进入濒死状态 如果有人给辣鸡那么他就不会死…
ok 上代码
#include<bits/stdc++.h>
using namespace std;
int m,n,dp[101][101];
struct node{
int t,f,h;
}a[101];
bool cmp(node a, node b){
return a.t<b.t;
}
int sum,now=10;
int main(){
cin>>m>>n;
for(int i=1;i<=n;i++)cin>>a[i].t>>a[i].f>>a[i].h;
sort(a+1,a+1+n,cmp);
memset(dp,-1,sizeof(dp));
dp[0][0]=10;
for(int i=0;i<n;i++){
for(int j=0;j<=m;j++){
if(dp[i][j]<0)continue;
if(j+a[i+1].h>=m&&dp[i][j]+a[i].t-a[i+1].t>=0){
printf("%d\n",a[i+1].t);
return 0;
}
if(dp[i][j]>=a[i+1].t-a[i].t){
dp[i+1][j+a[i+1].h]=max(dp[i+1][j+a[i+1].h],dp[i][j]-a[i+1].t+a[i].t);
dp[i+1][j]=max(dp[i+1][j],dp[i][j]-a[i+1].t+a[i].t+a[i+1].f);
}
}
}
for(int i=1;i<=n;i++){
if(now-a[i].t+a[i-1].t<0){
printf("%d\n",sum+now);
return 0;
}
now=now-a[i].t+a[i-1].t+a[i].f;
sum=a[i].t;
}
printf("%d\n",sum+now);
}