Educational Codeforces Round 73 (Rated for Div. 2)

25 篇文章 0 订阅
18 篇文章 0 订阅
本文探讨了一种算法问题,即给定一系列具有高度和费用属性的元素,如何通过增加元素高度来确保任意相邻元素高度不同,同时最小化总花费。算法采用动态规划策略,考虑每个元素最多增加两次高度,以解决大规模数据集问题。
摘要由CSDN通过智能技术生成

D. Make The Fence Great Again

theme:给定n个元素,每个元素有两个属性,高度ai与加高单位1的费用b[i],现要增加若干个元素的高度,使得任意相邻两元素的高度不同,每个元素可增高多次,问最少花费多少钱?1<=q<=3e5,1<=n<=3e5,sum(n)<=3e5,1<=ai<=bi<=1e9,答案<=1e18

solution:考虑用d[i][j]表示处理到元素i,将元素i增高j单位长度所需的最小费用,由于这题总的n可达3e5,所以第二维不能太大。分析题目可知每个元素最多增高两次就行,因为它为了与某一边不等则增高一次,若增高一次后与另一边相等了,则再增高一次即可。所以j取0,1,2。考虑转移方程,对于每个dp[i][j]它只与前一个dp[i-1][0],dp[i-1][1],dp[i-1][2],只要j与0/1/2的组合满足不等,则更新dp[i][j]为最小值。

注意q,n较大,别用memset初始化,T。==

#include<bits/stdc++.h>
using namespace std;
#define far(i,t,n) for(int i=t;i<n;++i)
#define pb(a) push_back(a)
#define lowbit(x) x&(-x)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll inf=0x3f3f3f3f3f3f3f3f;
int mod=1e9+7;
const int maxn=300010;

ll a[maxn],b[maxn];
ll dp[maxn][3];

int main()
{
    int q;
    cin>>q;
    while(q--)
    {
        int n;
        scanf("%d",&n);
        far(i,0,n)
            far(j,0,3)
                dp[i][j]=inf;
        far(i,0,n)
            scanf("%I64d%I64d",&a[i],&b[i]);
        dp[0][0]=0;
        dp[0][1]=b[0];
        dp[0][2]=2*b[0];
        far(i,1,n)
            far(pre,0,3)
                far(k,0,3)
                    if(a[i-1]+pre!=a[i]+k)
                        dp[i][k]=min(dp[i][k],dp[i-1][pre]+k*b[i]);
        ll ans=min(dp[n-1][0],min(dp[n-1][1],dp[n-1][2]));
        printf("%I64d\n",ans);

    }
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值