首页 > 数据库 >cf-typedb2023-C

cf-typedb2023-C

时间:2023-04-29 18:13:45浏览次数:50  
标签:int mi cf num mx dp typedb2023

题目链接:https://codeforces.com/problemset/problem/1787/C

我是sb,这种dp都没想到。。。

思路:首先得发现一个性质(贪心),每个数拆成的两个数一定是一个最大的(尽可能),另一个最小(尽可能)。这点不难证明,随便写写式子可得证。由于每个数只会影响相邻的两个数,所以我们可以dp算答案。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int num[N];
int mx[N],mi[N];
long long dp[N][2];
void solve(){
    int n,k;
    cin>>n>>k;
    for (int i=1;i<=n;i++) {
        cin>>num[i];
        if (num[i]>=2*k) mx[i] = num[i]-k,mi[i] = k;
        else if (num[i]>=k) mx[i] = k,mi[i] = num[i]-k;
        else mx[i] = num[i],mi[i] = 0;
    }
    for (int i=2;i<n;i++){
        if (i==2){
            dp[i][1] = 1ll*num[1]*mx[i];
            dp[i][0] = 1ll*num[1]*mi[i];
        }else{
            dp[i][1] = min(dp[i-1][0]+1ll*mx[i-1]*mx[i],dp[i-1][1]+1ll*mi[i-1]*mx[i]);
            dp[i][0] = min(dp[i-1][0]+1ll*mx[i-1]*mi[i],dp[i-1][1]+1ll*mi[i-1]*mi[i]);
        }
    }
    long long ans = min(dp[n-1][0]+1ll*mx[n-1]*num[n],dp[n-1][1]+1ll*mi[n-1]*num[n]);
    cout<<ans<<'\n';
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int T;
    T = 1;
    cin>>T;
    while(T--) solve();
    return 0;
}

标签:int,mi,cf,num,mx,dp,typedb2023
From: https://www.cnblogs.com/xjwrr/p/17364316.html

相关文章

  • CF600E Lomsat gelral(树上启发式合并)
    题目链接:https://codeforces.com/problemset/problem/600/E这是一道树上启发式合并的题,就只是在模板的基础上稍微变化了一下解题思路:我们需要计算当前u节点的答案,要计算加入非重链节点对此答案的影响,在计算加入节点对ans影响的时候,遍历u除了重链外的所有子树节点(因为重链部分的......
  • 利用snpEff对基因型VCF文件进行变异注释的详细方法
    利用snpEff对VCF文件进行变异注释群体遗传研究中,在获得SNP位点后,我们需要对SNP位点进行注释,对这些SNP位点进行更深的了解。snpEff是一个用于对基因组单核苷酸多态性(SNP)进行注释的软件,snpEff软件可以用于对VCF文件进行变异注释,使用时需要先进行安装,然后构建参考基因组数据库,即......
  • CF1656F Parametric MST 题解
    为了便于解题,先对\(a\)数组从小到大进行排序。首先,根据定义可以得出总价值的表达式:\[\begin{aligned}W&=\sum\limits_{(u,v)\inE}[a_ua_v+t(a_u+a_v)]\\&=\sum\limits_{(u,v)\inE}a_ua_v+t\sum\limits_{(u,v)\inE}(a_u+a_v)\end{aligned}\]接着,我们需要发现一个比较......
  • 题解 CF1264D1
    前言数学符号约定:\(\dbinom{n}{m}\):表示\(n\)选\(m\)。如非特殊说明,将会按照上述约定书写符号。题目分析:考虑题目的问题弱一点的版本,假设此时我们的括号序列是确定的如何求其括号匹配的最深深度。如果你有些许dp基础的话,不难想到如下做法:考虑位置\(i\),将区间\([1,......
  • 题解 CF1264D2
    前言建议大家看一下我对于D1的题解(传送门)后再看本题解,本题解是基于那篇题解的基础上书写的。数学符号约定\(\dbinom{n}{m}\):表示\(n\)选\(m\)。如非特殊说明,将会按照上述约定书写符号。题目分析首先引用一下D1的答案:\(\displaystyle\sum_{i=1}^n\displaystyle\sum_{......
  • cf-edu-142.D
    题目链接:https://codeforces.com/problemset/problem/1792/D算法:tire树求最长公共前缀(lcp)。反思:题目转换出的题意已大致得到,但怎么具体求不会。思路:tire树维护一个结构,1在哪些位置出现,2在哪些位置出现,以此类推。代码:#include<bits/stdc++.h>usingnamespacestd;consti......
  • cf-div.2-868-D
    题目链接:https://codeforces.com/contest/1823/problem/D比赛的时候关键性质已经想到,但没想到怎么正确构造。性质:每次新加一个字母,回文子串的数量最多增加1(因为题目需要不相同的回文子串)。证明:可以用反证法,易证。构造方法:由于k的值很小(只有20),所以对于不再增加(回文子串)的......
  • CF1814E Chain Chips & CF750E New Year and Old Subsequence - 动态 dp -
    一句话概括动态dp:用来解决带修改/多次区间询问的dp问题。将转移写成矩阵的形式,然后利用线段树求解区间问题/单点修改1814E注意一条边要么选2要么选0次,而且第一条边一定是选了2次。如果有一条边没选,那么这条边两侧的边一定都选了。设\(f_i\)代表考虑到第\(i\)条边,......
  • CF960F Pathwalks | 线段树优化DP
    题目设\(dp[x,w]\)为以结点\(x\)为结尾,且最后一条边边权为\(w\)的最长路径长度。考虑根据顺序加边,对于边\((u,v)\),更新\[dp[v,w]=\max_{w'<w}\{dp[u,w']\}+1\]对于每个节点,建一棵线段树,维护\(dp[x]\),这样每次更新\(dp[v,w]\)就相当于在\(dp[u]\)所对应的线段树中查询\([......
  • CF1699A The Third Three Number Problem
    题意简述构造出一个三元组a,b,c使得(a⊕b)+(a⊕c)+(b⊕c)=n,若无解输出-1。符号⊕的意思为异或个人分析首先要了解异或符号的性质:1,x⊕0=x2,x⊕x=x根据异或符号的性质可以得到一下构造:a=b=0,c=n/2c=0,a=b=n/2通过上述可以发现答案都是偶数所以若n为奇则无解......