首页 > 其他分享 >TZOJ8036--生日礼物

TZOJ8036--生日礼物

时间:2023-08-10 22:11:57浏览次数:34  
标签:int le const -- 负数 生日礼物 TZOJ8036 正数 ri

题目简述:

  给你n个数,让你选取不超过m个连续的区间,区间不重叠,求区间总和最大。

标准输入

  5 2
  2 -3 2 -1 2

标准输出

  5

思路:

1.很显然能够想到把原数组简化成形如一正一负的数组。

2.特殊情况,当正数连续块小于等于m时答案很显然是所有正数相加。

3.一般情况,当正数连续块大于m时,先统计所有正数的总和,再考虑合并区间。这时候,只剩下两种可以选择的操作,选择一个正数,让其左右两侧负数合并;选择一个负数,让其左右两侧的正数合并。很容易发现在这之后这左右两侧的数无法再被选中。

先来说说选择正数,合并负数的情况,这时候相当于舍弃了这个正数,正数连续块-1。

再来看看选择负数,合并正数的情况,这时候相当于吸纳了这个负数,使两个正数连续块合并了,正数连续块-1。

那么直至正数连续块=m时,此时所有的正数连续块总和就是答案。

所以很容易想到贪心的做法,看看舍弃正数的代价小还是吸纳负数的代价小。

比较特殊的情况,当负数在数组两侧时,选择该负数不会产生任何效果。

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
typedef unsigned long long llu;
const double e=1e-7;
const int N=1e5+7;
const int MOD=1e9+7;
const int LINF=1e18;
const int P=131;
bool C=0;
int a[N];
int le[N],ri[N];
void move(int x){
    a[x]=LINF;
    le[ri[x]]=le[x];
    ri[le[x]]=ri[x];
}
void solve(){
    int n,m;
    cin>>n>>m;
    int I=0;
    for(int i=1;i<=n;i++){ //把给定的数组变成 正负正负的数组,处理0是关键
        int x;
        cin>>x;
        if(x==0) continue;
        if(a[I]*x>0) a[I]+=x;
        else a[++I]=x;
    }
    int res=0;
    int sum=0;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;   
    for(int i=1;i<=I;i++){
        if(a[i]>0) res+=a[i],sum++;
        le[i]=i-1;
        ri[i]=i+1;
        q.push({abs(a[i]),i});
    }
    if(m>=sum){ //若整数连续块小于等于m则直接输出即可
        cout<<res<<endl;
        return;
    }
    while(true){
        if(sum<=m) break; //退出条件
        if(q.top().first!=abs(a[q.top().second])){ //清除无用的状态
            q.pop();
            continue;
        }
        int x=q.top().second;
        q.pop();
        if(a[x]<=0&&(le[x]==0||ri[x]==I+1)){ //如果边界是负数则不产生影响
            if(le[x]==0) le[ri[x]]=le[x];
            if(ri[x]==I+1) ri[le[x]]=ri[x];
            a[x]=LINF;
            continue;
        }
        else{
            res-=abs(a[x]);
            a[x]+=a[le[x]]+a[ri[x]];
            /* 可以思考一下,下列代码能否替换move函数
            a[le[x]]=LINF;
            a[ri[x]]=LINF;
            ri[le[le[x]]]=x;
            le[x]=le[le[x]];
            le[ri[ri[x]]]=x;
            ri[x]=ri[ri[x]];
            */
            move(le[x]);
            move(ri[x]);
            sum--;
        }
        q.push({abs(a[x]),x});
    }
    cout<<res<<endl;
}
signed main(){  
    IOS;
    int t;
    if(C) cin>>t; 
    else t=1;
    while(t--) solve();
}

 

标签:int,le,const,--,负数,生日礼物,TZOJ8036,正数,ri
From: https://www.cnblogs.com/Feintl/p/17621687.html

相关文章

  • 项目经理面试题 P3
    1、项目经理最重要的能力是什么?普通回答:项目经理最重要的能力是沟通能力,协调能力,解决问题的能力。独特回答:项目经理最重要的能力是一种软实力,是一种在什么场合,什么时候知道用什么样的项目管理方法和工具来解决我们实际的问题,推动项目成功的能力,很多人会吧这种能力叫做解决问题的......
  • 店铺营业状态设置_功能测试&文档接口的分类
       ......
  • GAMES101笔记(04)
    本篇对应的是第七课上节课讲完了光栅化的内容,这节课讲的有深度测试,光照和着色深度测试我在学校看shader入门精要的时候有些印象,但也仅此而已了,我觉得还是要先补一下图形学的知识再去啃入门精要会好一些 深度缓存在计算机成像时,对于一个我们要输出的画面,如何确保画面上的东......
  • 《天道》观后感
    《天道》是一本关于格律乐器生产流程和如何控制质量的电视剧,它向读者展示了乐器制造领域中的精湛工艺和不懈的追求。阅读完《天道》,我深感乐器制造的艺术性与技术性的完美结合,以及制造者对于质量的严苛要求与掌控。在《天道》中,作者以生动的笔触描述了格律乐器的制作过程,......
  • Tidb异名恢复Mysql数据库的过程
    Tidb异名恢复Mysql数据库的过程背景先说坑:TiDB备份恢复的方式1.mysqldump+mysqlsource的方式.2.mydumper+loadertidb的一个工具组件3.lightningdumpling的备份恢复方式是4.brbackuprestore备份恢复的方式.好像除了方式1都没提供明确的更换数据库的......
  • CSP模拟 17
    今天挂了\(\text{85\pts}\),谨记本地编译要开\(\operatorname{O}_2\),离线处理的题最后输出一定要再排序排回来。A.弹珠游戏考虑用一个01串表示每个人的状态,表示每个人所拥有球的情况。例如R->100、G->010、B->001、RG->110、RB->101、BG->011。考虑贪心,对于一个新的弹......
  • C#计时器
    namespacejishiqi{publicpartialclassForm1:Form{intcount;inttime;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){......
  • 微信抢红包操作步骤及需要安装软件的步骤
    微信抢红包操作步骤:打开微信,进入聊天窗口。在聊天窗口中,如果有红包消息会显示“红包”字样,点击这条消息。在红包界面,点击“抢红包”按钮。如果是口令红包,需要输入正确的口令才能打开红包。打开红包后会显示红包金额,点击“开”即可领取红包。返回到聊天窗口或者退出微信。......
  • 「学习笔记」并查集
    真的有必要说吗?直接上封装好的模板吧,包含路径压缩和按秩合并。structunion_find_set{intfa[N],siz[N];int&operator[](constint&x){returnfa[x];}voidreset(){for(inti=1;i<=n;++i){fa[i]=i;......
  • 【Oracle】 insert performance issue
    https://blog.iarsov.com/oracle/insert-statement-taking-long-time/--->https://blog.iarsov.com/oracle/sequences-cache-nocache/......