原题链接:https://codeforces.com/contest/1221/problem/D
d[i][0]表示第i个不加长的最小费用
d[i][1]表示第i个加长1的最小小费用
d[i][2]表示第i个加长2的最小费用
代码:
#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
ll a,b;
}q[300005];
ll d[300005][5];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
ll n;
scanf("%lld",&n);
for(int i=0;i<n;i++)
{scanf("%lld %lld",&q[i].a,&q[i].b);}
d[0][0]=0;d[0][1]=q[0].b;d[0][2]=q[0].b*2;
for(int i=1;i<n;i++)
{
if(q[i].a==q[i-1].a-2)
{
d[i][0]=min(d[i-1][0],d[i-1][1]);
d[i][0]=min(d[i][0],d[i-1][2]);
d[i][1]=min(d[i-1][0]+q[i].b,d[i-1][1]+q[i].b);
d[i][1]=min(d[i][1],d[i-1][2]+q[i].b);
d[i][2]=min(d[i-1][1]+q[i].b*2,d[i-1][2]+q[i].b*2);
}
else if(q[i].a==q[i-1].a-1)
{
d[i][0]=min(d[i-1][0],d[i-1][1]);
d[i][0]=min(d[i][0],d[i-1][2]);
d[i][1]=min(d[i-1][1]+q[i].b,d[i-1][2]+q[i].b);
d[i][2]=min(d[i-1][0]+q[i].b*2,d[i-1][2]+q[i].b*2);
}
else if(q[i].a==q[i-1].a)
{
d[i][0]=min(d[i-1][1],d[i-1][2]);
d[i][1]=min(d[i-1][0]+q[i].b,d[i-1][2]+q[i].b);
d[i][2]=min(d[i-1][0]+q[i].b*2,d[i-1][1]+q[i].b*2);
}
else if(q[i].a==q[i-1].a+1)
{
d[i][0]=min(d[i-1][0],d[i-1][2]);
d[i][1]=min(d[i-1][0]+q[i].b,d[i-1][1]+q[i].b);
d[i][2]=min(d[i-1][0]+q[i].b*2,d[i-1][1]+q[i].b*2);
d[i][2]=min(d[i][2],d[i-1][2]+q[i].b*2);
}
else if(q[i].a==q[i-1].a+2)
{
d[i][0]=min(d[i-1][0],d[i-1][1]);
d[i][1]=min(d[i-1][0]+q[i].b,d[i-1][1]+q[i].b);
d[i][1]=min(d[i][1],d[i-1][2]+q[i].b);
d[i][2]=min(d[i-1][0]+q[i].b*2,d[i-1][1]+q[i].b*2);
d[i][2]=min(d[i][2],d[i-1][2]+q[i].b*2);
}
else
{
d[i][0]=min(d[i-1][0],d[i-1][1]);
d[i][0]=min(d[i][0],d[i-1][2]);
d[i][1]=min(d[i-1][0]+q[i].b,d[i-1][1]+q[i].b);
d[i][1]=min(d[i][1],d[i-1][2]+q[i].b);
d[i][2]=min(d[i-1][0]+q[i].b*2,d[i-1][1]+q[i].b*2);
d[i][2]=min(d[i][2],d[i-1][2]+q[i].b*2);
}
}
ll ans=min(d[n-1][0],d[n-1][1]);
ans=min(ans,d[n-1][2]);
printf("%lld\n",ans);
}
return 0;
}