2023NOIP A层联测28-青鸹

news/2024/12/21 19:30:34/

现在有 n n n 只青鸹,每只青鸹有一个毒瘤系数,他们排成了一个序列。

你可以重复以下操作,直到序列中只剩下一只青鸹的时候停止,每次操作可以自选进行 1 1 1 还是 2 2 2 操作,并且自选进行操作的位置:

  1. 选择一只在序列端点位置的青鸹,将这只青鸹杀死。

  2. 选择一只在序列非端点位置的青鸹(假设在 i i i 位置),将这只青鸹( i i i 位置)杀死,将这只青鸹旁边的两只青鸹( i − 1 i-1 i1 i + 1 i+1 i+1 位置)合体(即合体为一只青鸹,其毒瘤系数为两只青鸹的毒瘤系数加起来的和),放在 i i i 位置上。

每次操作结束后,如果一个位置没有青鸹,则其后面的青鸹会自动补位,也就是说不会有空位。

你想让最后剩下的青鸹的毒瘤系数最高,请输出这个最高的毒瘤系数,并且输出最少操作次数。

n ≤ 1 0 6 n\le10^6 n106


显然两个数要对答案产生贡献,二者之间的数的个数必为奇数,如果是偶数,就不能仅删除中间的部分。

手模后发现,设对答案产生贡献的数为 a p 1 , a p 2 , … , a p k a_{p_1},a_{p_2},\dots,a_{p_k} ap1,ap2,,apk p 1 ≡ p 2 ≡ ⋯ ≡ p n ( m o d 2 ) p_1\equiv p_2\equiv\dots\equiv p_n\pmod 2 p1p2pn(mod2)

所以最优策略是在奇数或偶数位置选全部正数,然后确定了选的数后,把相邻两个数之间的连续段删去即可,发现中间的最小操作次数就是连续段长度除以 2 2 2,两边的段单独求。

特判序列全部都是负数的情况。

时间复杂度 O ( n ) O(n) O(n)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define dis(x) (x>1?(x+1>>1):0)
constexpr ll INF=1e18;
const int N=1e6+1;
int n,cnt1,cnt2;
ll ans1,ans2,a[N];
struct node
{ll x,i;
}b1[N],b2[N];
int main()
{freopen("friends.in","r",stdin);freopen("friends.out","w",stdout);cin.tie(0)->sync_with_stdio(0);int fl=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];if(i&1) b1[++cnt1]={a[i],i};else b2[++cnt2]={a[i],i};if(a[i]>0) fl=1;}if(!fl){ll maxn=-INF,maxi;for(int i=1;i<=n;i++){if(maxn<a[i]){maxn=a[i];maxi=dis(i)+dis(n-i+1);}else if(maxn==a[i]) maxi=min(maxi,1ll*dis(i)+dis(n-i+1));}cout<<maxn<<"\n"<<maxi;return 0;}ll maxi=-INF,mini=INF,sum=0;for(int i=cnt1;i>=1;i--){if(b1[i].x<=0) continue;sum+=b1[i].x;maxi=max(maxi,b1[i].i);mini=min(mini,b1[i].i);}ans1=sum,ans2=(maxi-mini)/2+dis(mini)+dis(n-maxi+1);sum=0,maxi=-INF,mini=INF;for(int i=cnt2;i>=1;i--){if(b2[i].x<=0) continue;sum+=b2[i].x;maxi=max(maxi,b2[i].i);mini=min(mini,b2[i].i);}if(ans1<sum) ans1=sum,ans2=(maxi-mini)/2+dis(mini)+dis(n-maxi+1);else if(ans1==sum) ans2=min(ans2,(maxi-mini)/2ll+dis(mini)+dis(n-maxi+1));cout<<ans1<<"\n"<<ans2;
}

http://www.ppmy.cn/news/1210008.html

相关文章

Python 对象表现得像函数

Python 对象表现得像函数 flyfish 面向对象编程里有句话一切皆对象。everything is an object&#xff0c;python里就是这样 module 是 object import math my_math math my_math.a1 #为module object新增一个名为a的属性 print(my_math.a)class 是 object class Person:…

设备零部件更换ar远程指导系统加强培训效果

随着科技的发展&#xff0c;AR技术已经成为了一种广泛应用的新型技术。AR远程指导系统作为AR技术的一种应用&#xff0c;具有非常广泛的应用前景。 一、应用场景 气象监测AR教学软件适用于多个领域&#xff0c;包括气象、环境、地理等。在教学过程中&#xff0c;软件可以帮助学…

NZ系列工具NZ06:VBA创建PDF文件说明

我的教程一共九套及VBA汉英手册一部&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到数据库&#xff0c;到字典&#xff0c;到高级的网抓及类的应用。大家在学习的过程中可能会存在困惑&#xff0c;这么多知识点该如何组织…

基于STM32设计的智能水母投喂器(华为云IOT)

基于STM32设计的智能水母养殖系统 一、设计简述 1.1 项目背景 水母是一种非常美丽和神秘的生物,在许多人的眼中,它不仅是一种宽广的海洋世界中的一道美丽的风景线,同时也是一种珍贵的实验动物和养殖资源。随着水母的养殖需求不断增多,一个高效、智能、可控的水母养殖系统…

区块链探秘:从基础到深度,全面解读区块链技术与应用

1.区块链基本概念 1.发展历史 比特币诞生&#xff1a; 2008年&#xff0c;化名为中本聪的人发表了论文《Bitcoin&#xff1a;A Peer-to-Peer Electronic Cash System》 2009年1月3日&#xff0c;中本聪开发运行了比特币客户端程序并进行了首次挖矿&#xff0c;获得了第一批…

HTB——常见端口及协议总结

文章目录 一、 常见端口二、HTTP协议三、FTP四、SMB 一、 常见端口 http协议&#xff1a;80、8000https协议&#xff1a;443、8443ftp协议&#xff1a;20&#xff08;数据传输&#xff09;、21&#xff08;发送命令&#xff09;smb协议&#xff1a;445 二、HTTP协议 https的…

n-gram语言模型——句子概率分布计算与平滑

n-gram语言模型——句子概率分布计算与平滑 前言 语言模型 等价假设 n元语法 句子概率分布计算方式 数据平滑 Lidstone平滑(1-gram) Laplace平滑(1-gram) 附上两种平滑在1-gram下代码 Lidstone平滑与Laplace平滑(2-gram) 附上两种平滑在2-gram下代码 前言 语言模型…

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码&#xff0c;所以对于python语言中的常见数据结构的用法也不是很熟悉&#xff0c;对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的&#xff0c;属性都是自己定义&a…