Educational Codeforces Round 137 (Rated for Div. 2) E题分享
作者:
SunnyYuan
,
2022-10-18 23:42:11
,
所有人可见
,
阅读 222
主要思路是dp
我理解并加上注释,供大家食用。
#include <cstdio>
#include <cstring>
#define int long long
using namespace std;
inline int read()
{
int a=0,f=1;
char ch=getchar();
while(ch<48||ch>57)
{
if(ch==45)f=-1;
ch=getchar();
}
while(48<=ch&&ch<=57)
{
a=(a<<1)+(a<<3)-48+ch;
ch=getchar();
}
return a*f;
}
void write(int x)
{
if(!x)return;
write(x/10);
putchar(x%10+48);
}
void pt(int x)
{
if(!x)putchar(48);
else if(x<0)x=-x,putchar(45);
write(x);
putchar(10);
}
const int N=5010;
int p1=read(),t1=read();
int p2=read(),t2=read();
int h=read(),s=read();
int c1=p1-s,c2=p2-s,c3=p1+p2-s;
int f[N];
int min(int a,int b)
{
return a<b?a:b;
}
int max(int a,int b)
{
return a>b?a:b;
}
signed main()
{
memset(f,0x3f,sizeof(f));
f[0]=0;
for(int i=1;i<=h;i++)
{
f[i]=min(f[max(0,i-c1)]+t1,f[max(0,i-c2)]+t2);
for(int j=1;j<=i;j++)
{
if(j*t1>=t2)
{
int c=(j-1)*c1+(j*t1-t2)/t2*c2+c3;
f[i]=min(f[i],f[max(0,i-c)]+j*t1);
}
if(j*t2>=t1)
{
int c=(j-1)*c2+(j*t2-t1)/t1*c1+c3;
f[i]=min(f[i],f[max(0,i-c)]+j*t2);
}
}
}
pt(f[h]);
return 0;
}