首页 > 其他分享 >CF 1579 G

CF 1579 G

时间:2024-09-09 22:46:17浏览次数:7  
标签:int max 线段 CF 1579 端点 dp 1000

题目描述

在一根数轴上,你将依次放入 \(N\) 根长度为 \(d_i\) 的线段。

每次,你可以将线段放置于数轴上并使得其中一段等于上一段的末尾。假设上一次的末尾为 \(x\),则这次你可以将线段置于 \([x-d,x]\) 或 \([x,x+d]\),并将 \(x\) 设为 \(x-d\) 或 \(x+d\)。

求最终摆出的的·线段长度并最小值。

思路

令 \(dp_{i,j}\) 表示考虑前 \(i\) 根线段,上一次的末尾离左端点的距离为 \(j\) 时离右端点最近可以是多少。

很明显有转移:

\[\begin{array}{l} dp_{i+1,j+d_{i+1}}\leftarrow \max(0,dp_{i,j}-d_{i+1})\\ dp_{i+1,\max(0,j-d_{i+1})}\leftarrow dp_{i,j}+d_{i+1} \end{array} \]

但这里的 \(j\) 有多大呢?

你可能会想到 \(1000\),毕竟最大线段长度就 \(1000\)。

但如果当前是右端点,接着依次出现一个 \(500,1000\),此时就无法做到不超过右端点,即 \(j>1000\)。

但实际上 \(j\le 2000\),因为只要有一个长度为 \(2000\) 的区间,在里面怎么跳都是不会越界的。

时空复杂度均为 \(O(N\max\{d_i\})\)。

代码

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 10001, MAXV = 2001;

int t, n, a[MAXN], dp[MAXN][MAXV], ans;

void Solve() {
  cin >> n;
  for(int i = 1; i <= n; ++i) {
    cin >> a[i];
  }
  for(int i = 0; i <= n; ++i) {
    for(int j = 0; j <= 2000; ++j) {
      dp[i][j] = 114514;
    }
  }
  dp[0][0] = 0;
  ans = 114514;
  for(int i = 0; i < n; ++i) {
    for(int j = 0; j <= 2000; ++j) {
      if(j + a[i + 1] <= 2000) {
        dp[i + 1][j + a[i + 1]] = min(dp[i + 1][j + a[i + 1]], max(0, dp[i][j] - a[i + 1]));
      }
      dp[i + 1][max(0, j - a[i + 1])] = min(dp[i + 1][max(0, j - a[i + 1])], dp[i][j] + a[i + 1]);
    }
  }
  for(int i = 0; i <= 2000; ++i) {
    ans = min(ans, dp[n][i] + i);
  }
  cout << ans << "\n";
}

int main() {
  ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  for(cin >> t; t--; Solve()) {
  }
  return 0;
}

标签:int,max,线段,CF,1579,端点,dp,1000
From: https://www.cnblogs.com/yaosicheng124/p/18405536

相关文章

  • 题解:CF913C Party Lemonade
    分析因为容量为\(2^{i-1}\),所以对于任意的\(i<j\),第\(j\)种瓶子一定可以通过选择\(2^{j-i}\)个\(i\)种瓶子来实现。定义一个瓶子的性价比为\(\dfrac{\textrm{容量}}{\textrm{价格}}\),即\(\dfrac{2^{i-1}}{c_i}\)。我们可以按照每个瓶子的性价比从高到低排序,依次选择......
  • 题解:CF913D Too Easy Problems
    题意给定一场考试,考试会持续\(T\)毫秒,由\(n\)道题目组成,你可以用\(t_i\)毫秒解决第\(i\)个问题,每个问题给定一个整数\(a_i\)。要求你选出一个试题集合\(S\),若该集合大小为\(k\),它应满足\(T\geq\sum_{i\inS}\limitst_i\),你需要最大化\(\sum_{i\inS}\limits[a_i......
  • CF1621G Weighted Increasing Subsequences 题解
    题目链接点击打开链接题目解法这种题就感觉每一步都不难想,但串在一起就不会显然考虑位置\(x\)作为\(lis\)的一部分,合法的\(lis\)的个数合法的约束是:令\(lis\)的最后一个位置为\(last\),满足\(\max\{a_{last+1},...,a_n\}>a_x\)不难发现,合法的\(last\)是一段区间......
  • CF2006D Iris and Adjacent Products
    题意https://codeforces.com/contest/2006/problem/D分析考虑如果没有修改怎么重排最优。先把最大值丢进序列,再把最小值丢进序列,再把次大值丢进序列,再把次小值压进去,以此类推。感性理解的话不难发现这是最优情况,具体证明可以考虑调整法(但我懒)。令\(b\)为\(a\)排序后的结果......
  • CF1192B/P6845 Dynamic Diameter
    题意给定一棵带权树和\(q\)次询问,每次询问修改一条树边的权值,并查询修改后树的直径。询问之间不独立。\(n,q\le10^5\),强制在线。分析回想一下,两个点的距离可以被表示成\(dep_x+dep_y-2dep_{lca(x,y)}\)。而树的直径,本质上就是求\(\max_{x,y}dep_x+dep_y-2dep_{lca(x,y)}......
  • 录用超快!IEEE旗下6本实力强悍,CCF推荐,基本不拒稿的SCI神刊!
    1、IEEETransactionsonSustainable Computing•影响因子:3•期刊分区:JCR2区,中科院3区•检索数据库:SCIE•自引率:3.30%•征稿领域:探讨可持续计算的不同方面,涉及从软件和硬件设计到应用程序的广泛问题领域和技术。•期刊入选计算机学会CCF-C类推荐2、IEEETrans......
  • CCF推荐B类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)
    目录前言B类会议1.SoCC2.SPAA3.PODC4.FPGA5.CGO6.DATE7.HOTCHIPS8.CLUSTER9.ICCD10.ICCAD11.ICDCS12.CODES+ISSS13.HiPEAC14.SIGMETRICS15.PACT16.ICPP17.ICS18.VEE19.IPDPS20.Performance21.HPDC22.ITC23.LISA24.MSST25......
  • 推荐系统的基础_协同过滤(CF)
    协同过滤(CollaborativeFiltering)是一种推荐系统算法,它通过分析用户之间的相似性或者物品之间的相似性来预测用户可能感兴趣的物品。协同过滤算法主要有两种类型:1.用户基协同过滤(User-basedCollaborativeFiltering):  这种方法通过找到与目标用户兴趣相似的其他用户,然后......
  • CF1534F2 Falling Sand (Hard Version) 题解
    题目链接点击打开链接题目解法做法1一个沙子消失,会带走所有它所在列下面的沙子我们记每列从下往上第\(a_i\)个沙子为关键点,第\(i\)列至少消失\(a_i\)个沙子等价于所有关键点都消失一个显然的事情是:记一列最上面的沙子为起始点,则我们只会干扰起始点第一感觉是找到一......
  • CF 2008 H
    题目描述给定一个长度为\(N\)的序列\(A\),以及\(Q\)次询问,每次询问给定一个\(x\)。你可以执行以下操作任意次:选择一个\(1\lei\leN\)使得\(A_i\gex\)。令\(A_i\leftarrowA_i-x\)。求\(A\)的最小中位数。这里中位数是\(A\)排序后的第\(\lfloor\frac......