IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Codeforces Round #809 (Div. 2) problem: (C) Qpwoeirut And The City -> 正文阅读

[C++知识库]Codeforces Round #809 (Div. 2) problem: (C) Qpwoeirut And The City

一.题意?

给你n个排成一排的建筑,每个建筑有一个高度指标h[i],我们定义当i>=2 && i<=n-1的时候的时候,若h[i]>=h[i-1]&&h[i]>=h[i+1]? 那么这个建筑物是酷炫的!

现在给到你砖瓦可以在任何一个建筑上加盖楼层,但是不能将已有的楼层拆卸。

你的目的是使用最少的砖瓦,使得酷炫建筑数量最大化。

二.思路

最下面有个总结,觉得下面的解释太长的小伙伴可以直接看下面的总结,如果有不理解的地方可以再看我的详尽解释。

分情况来讨论

①如果n是奇数的话,那2~n-1的一个建筑一定是一个高低高低高低…………高的交错排序,因为如果一共有n个建筑,最终一定会有(n-1+2)/2(上取整公式 (n+m-1)/m)个酷炫建筑,所以一定最终是个这样的排列,自己可以画一画看一看(我自己有一个毛病就是老是空想,然后也许想的是错误的,但是没有自己拿笔写一写画一画,就觉得是正确的,犯了“我以为”的错误)那么这种情况只需要枚举一变看看需要多少个砖瓦就可以变成这种排列了。

②如果n是偶数的话,如果一共有n个建筑,最终一定会有n/2(上取整公式)个酷炫建筑。

【为了文章简洁性 这里 把酷炫建筑简称为 高 不酷炫建筑简称为 低】

而这些酷炫建筑一定是间隔出现的 ,经过初步思考,我觉得可以是高低高低……高低或者是低高低高……低高两种方案,但是又看了一下样例的这个:

6
1 10 1 1 10 1

发现可以出现 1次 两高中间间隔两个低的情况 这样也是满足有n/2个酷炫建筑的。

但是这种情况开头第2个建筑必定为高,也就是酷炫建筑,并且我们可以发现若第i个建筑是高,第i+1和i+2个建筑都是低的话,其实建筑的排列节奏是从高低高低……高低第2个建筑为高之后交替排列? 在i+2处换成了低高低高……低高(第2个建筑为低之后交替排列),所以我们利用前缀和的思想分别记下来?前i个 建筑利用??低高低高……低高 节奏和?高低高低……高低 节奏的一个所有砖块数量,然后在每个i假设出现第i个建筑是高,第i+1和i+2个建筑都是低(节奏转变)这一情况,进行砖块数目的一个计算,计算公式是ans1[i]+ans2[n-1]-ans2[i+1],其中ans1[i]是把前i个建筑变成高低高低……高低一个排列形式所用的砖块数,ans2[i]是把前i个建筑变成低高低高……低高一个排列形式所用的砖块数,那么ans2[n-1]-ans2[i+1]就是把i+1个建筑之后的建筑变成低高低高……低高一个排列形式所用的砖块数,因此ans1[i]和ans2[n-1]-ans2[i+1]加起来就是整个的i假设出现第i个建筑是高,第i+1和i+2个建筑都是低(节奏转变)一个砖瓦数。

因此这种情况的话就枚举一个转折点就行啦!

总结一下:

两大情况:?

1.n为奇数? 要达到酷炫建筑最大化的一个排列形式固定,直接枚举算ans。

2.n为偶数,三种情况:

①第2个建筑为低,那么排列形式也是固定了,直接可以得到ans,也就是前缀和ans2[n-1]。

第2个建筑为高,第n-1个建筑为低,那么排列形式也是固定了,直接可以得到ans,也就是前缀和ans1[n-2]。

③第2个建筑为高,第n-1个建筑为高,那么这之间一定有一个转折点i使得第i个建筑是高,第i+1和i+2个建筑都是低,这时候会进行一个从高低高低……高低第2个建筑为高之后交替排列? 在i+2处换成了低高低高……低高(第2个建筑为低之后交替排列)一个转换,因此我们利用前缀和数组,分别记下分别利用这两种节奏在做到第i个建筑的时候的一个所用砖瓦数,然后再枚举这个转折点就行。

看到这里快要结束啦,很开心你可以点进来,如果文章对你有帮助的话,可以顺手点一下下面的小手手👍吗?你的支持是对我创作最大的鼓励 !

三.代码


#include <iostream>
#include <cstring>
#include <algorithm>
#include<map>
using namespace std;
map<int,int> st,cnt; 
const int N = 2e5+10;
typedef long long LL;
int n;
int a[N];
LL ans1[N],ans2[N];

void solve()
{
    
    cin>>n;
    for(int i=1;i<=n;i++)
    cin>>a[i];
    for(int i=1;i<=n+2;i++)
    {
        ans1[i]=0;
        ans2[i]=0;
    }
    LL ans=0;
    if(n&1) //n为奇数
    {
        for(int i=2;i<=n-1;i+=2)
        {
            if(a[i]<=a[i-1]||a[i]<=a[i+1])
            {
                ans+=max(a[i-1],a[i+1])-a[i]+1;
            }
        }
        
    }
    else//n为偶数
    {
        ans=2e14;//一定不要忘记初始化ans为数据最大值!
        for(int i=2;i<=n-1;i+=2)//这里的i代表把第i个变为高,所以间隔取数
        {
            if(a[i]<=a[i-1]||a[i]<=a[i+1])
            {
                ans1[i]+=max(a[i-1],a[i+1])-a[i]+1;//高低高低节奏下前i个使用的砖瓦数
            }
            if(i>=4) ans1[i]+=ans1[i-2];
        }
        for(int i=3;i<=n-1;i+=2)//这里的i代表把第i个变为高,所以间隔取数
        {
            if(a[i]<=a[i-1]||a[i]<=a[i+1])
            {
                ans2[i]+=max(a[i-1],a[i+1])-a[i]+1;//低高低高节奏下前i个使用的砖瓦数
            }
            if(i>=3) ans2[i]+=ans2[i-2];
        }
        for(int i=2;i<=n-4;i+=2)
        {
            ans=min(ans,ans1[i]+ans2[n-1]-ans2[i+1]);情况③的最小值
        }
        ans=min(ans,min(ans1[n-2],ans2[n-1]));//情况①②③取最小值
    }
    cout<<ans<<endl;
    
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        solve();
    }
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-20 18:34:21  更:2022-07-20 18:37:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/10 19:55:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码