首页 > 其他分享 >P4870 [BalticOI 2009 Day1]甲虫

P4870 [BalticOI 2009 Day1]甲虫

时间:2023-05-01 10:44:42浏览次数:52  
标签:露水 浪费 int Day1 P4870 MAXN 2009 dp 甲虫

题意:

有一只甲虫处于一根水平的树枝。因为他沉迷数学无法自拔,所以他觉得很像是在 \(x\) 轴上。
在同一根树枝上,还有 \(n\) 滴露水。每滴露水占用 \(m\) 个单位的水分。相对于甲虫的位置,他们的坐标分别是 \(x_1,x_2,\dots,x_n\)。
显然,这一天将会骄阳似火。每过一个时间单位,就会有一个单位的水分从每一滴露水流失。这只甲虫受尽了烈阳的折磨,以至于每当它碰到一滴露水都能瞬间喝完。在每个时间单位中它能移动一个单位的距离。
所以你要写一个程序,根据露水的坐标,计算出甲虫最多能喝到的水。

分析:

与关路灯那一道题相比,这个题恶心的点就在于水是会减少的,但减少到0时就不减少了。类比过去就相当于某个灯的功率减少到0就不变了,因此不能单纯地dp最少的浪费量。

那么,假如抛弃水滴数量减少到0就不变了这个条件,直接嗯dp,怎么才能消除影响呢?
考虑一段水的区间,长度为 \(c\),那么一共就有 \(m * c\) 这么多滴水。总数 - 浪费量就是你所能获得的水的数量。尽管按这个思路dp出的浪费量可能会过大以至于能获得的水的数量为负数,不过因为是取的max,也就无伤大雅。

总的思路如下:

  • 按 P1220 dp出每个区间的最小浪费数。
  • 枚举每个区间,算出最大得到水的数量作为ans
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 300;
int st,n,m,x[MAXN + 5],dp[MAXN + 5][MAXN + 5][2];
bool flag;
signed main(){
    scanf("%lld%lld",&n,&m);
    for(int i = 1; i <= n; i++){
        scanf("%lld",&x[i]);
        if(!x[i]){
            flag = 1;
        }
    }
    if(!flag)++n;
    sort(x + 1,x + 1 + n);
    for(int i = 1; i <= n; i++){
        if(x[i] == 0){
            st = i;
            break;
        }
    }
    int ans = 0;
    for(int c = 1; c <= n; c++){
        memset(dp,0x3f,sizeof dp);
        dp[st][st][0] = dp[st][st][1] = 0;
        for(int len = 2; len <= c; len++){
            for(int l = 1; l + len - 1 <= n; l++){
                int r = l + len - 1;
                dp[l][r][1] = min(dp[l][r - 1][1] + (x[r] - x[r - 1]) * (c - len + 1),dp[l][r - 1][0] + (x[r] - x[l]) * (c - len + 1));
                dp[l][r][0] = min(dp[l + 1][r][0] + (x[l + 1] - x[l]) * (c - len + 1),dp[l + 1][r][1] + (x[r] - x[l]) * (c - len + 1));
            }
        }
        for(int i = 1; i + c - 1 <= n; i++){
            ans = max(ans,m * c - dp[i][i + c - 1][0]);   
            ans = max(ans,m * c - dp[i][i + c - 1][1]);
        }
    }
    if(!flag)ans -= m;
    cout << ans;

}

ps:也就多转了个弯,难度就上紫了(

标签:露水,浪费,int,Day1,P4870,MAXN,2009,dp,甲虫
From: https://www.cnblogs.com/CZ-9/p/17366251.html

相关文章

  • qbxt day1
    数学知识现有奇数个人,两两间可能认识或不认识,请证明永远存在一个认识偶数个人的人。将其转化成更强的问题:给定一张奇数个点的图\(G\),证明度数为偶数的点的个数为奇数。继续考虑它的相反的问题:给定一张奇数个点的图\(G\),证明度数为奇数的结点的个数为偶数考虑所有点......
  • JOISC 2014 Day1
    T1巴士走读考虑在每个节点\(u\)维护\(f_u(x)\)表示在时刻\(x\)到达节点\(u\)时的最晚出发时间,显然这个函数单调递增。考虑进行转移,将所有巴士按照\(Y\)进行排序,依次枚举每辆巴士,设巴士出发节点为\(A\),终止节点为\(B\),发车时间为\(X\),到达时间为\(Y\),由于我们......
  • Fuzzing101-Exercise2 fuzz CVE-2009-3895和CVE-2012-2836
    autohr:cxingdate:2023年4月28日我们将对libexif0.6.14进行fuzz,目标是复现CVE-2009-3895和CVE-2012-2836两个漏洞。0x00准备工作我们先了解一下libexif这个库和两个CVE漏洞。关于libexif的信息如下:isalibrarywritteninpureportableC.readsandwritesEXI......
  • 完整实现React day10
    update流程与mount流程的区别。对于beginWork:需要处理ChildDeletion的情况需要处理节点移动的情况(abc->bca)对于completeWork:需要处理HostText内容更新的情况需要处理HostComponent属性变化的情况对于commitWork:对于ChildDeletion,需要遍历被删除的子树对于Update,需......
  • Day14
      3.代码示例#include<iostream>usingnamespacestd;intmain(){inta,b,num=0;cout<<""<<"白球"<<""<<"红球"<<""<<"黑球"<<endl;......
  • oracle数据恢复 - dbrecover-for-oracle2009
    软件可以使用社区版,限制行数未一万行直接使用向导,默认配置执行即可需要注意选择数据文件的时候如果不知道表空间在哪个文件中就选择所有的文件最后导入的时候需要注意指定数据库服务名称sqlldruserid=user/password@servicenamecontrol=C:\Users\Administrator\Desktop\ba......
  • Day13
      3.代码示例#include<iostream>usingnamespacestd;intjudge(int*c){inti,s=0;for(i=2;i<11;i++){if(c[1]!=c[i])s=1;}returns;}intmain(){intsweet[12]={20,10,2,8,22,16,4,10,6,14,20,0};inti,j=1;......
  • Day11
     2.代码示例#include<iostream>usingnamespacestd;intmain(){intn;doubles=0;cout<<"请输入您的个人收入:";cin>>n;cout<<"应缴纳税额为:";if(n<3500){s=0;}elseif(n<5000){......
  • mysql主从-day1——mysql主从搭建、django中使用多数据库做读写分离
    目录一、mysql主从5django使用多数据库做读写分离一、mysql主从#之前做过redis的主从,很简单#mysql稍微复杂一些,搭建mysql主从的目的是? -读写分离-单个实例并发量低,提高并发量-只在主库写,读数据都去从库#mysql主从原理步骤一:主库db的更新事件......
  • Day1,MarkDown基础
    一级标题二级标题以此类推字体字体粗体字体斜体字体加粗斜体字体删除引用引用内容分割线---或***图片![图片名字](图片路径)eg:![02]("C:\Users\86178\Pictures\SavedPictures\R-C.jfif")超链接名字列表1、a2、b或ab*表格第一种:右键插入第二种......