【UOJ 测试】A. 【#244 UER #7】短路(贪心(模拟+枚举))

2023-10-04 22:40

本文主要是介绍【UOJ 测试】A. 【#244 UER #7】短路(贪心(模拟+枚举)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A. 【UER #7】短路



“第七套广播体操,原地踏步——走!”

众所周知,跳蚤们最喜欢每天早起做早操,经常天还没亮就齐刷刷地站在操场做着反复纵跳热热身。跳晚国在研制三星 note7 的时候注意到了这点,于是他们打算让炸弹更快地引爆,这样就可以消灭更多早起的跳蚤。

三星 note7 的主板可以看作是由  (2n+1)×(2n+1) (2n+1)×(2n+1) 个中继器构成的,某些中继器会有导线连在一起,左上角和右下角的中继器分别连着电源的正负极。

电流流过一根导线的时间可忽略不计,但当电流经过中继器时,会延缓一段时间再从中继器流出。这个时间只跟该中继器本身有关,我们把这段时间的长度称为中继器的延时值。

这些中继器由导线连接围成一个一个的层,同个层的中继器的种类都一样,而不同层的种类都不一样,可以发现总共有  n+1 n+1 层。当  n=4

n=4 时,主板大概长这样


跳晚们打算再加几根导线将某些中继器连接起来.凭借发达的重工业,他们能生产出无数条导线。但由于主板的限制,他们的导线只能和主板四周的边平行,且其长度只够连接相邻两个中继器。

现在他们想知道,他们改造的三星 note7 的电源正极流出的电流能在多短的时间到达电源负极从而造成短路,这样电池就会释放出巨大的能量摧毁跳蚤国的有生力量了。

请参考输入格式和样例配图来更好地理解题意。

输入格式

第一行一个正整数  n n

第二行  n+1 n+1 个正整数  a0,a1,,an a0,a1,…,an,表示从内到外每层的中继器的延时值,单位为秒。其中,第  i i 行第  j j 列的中继器的延时值为(1<=i,j<=n)    

输出格式

输出一行一个数表示改造后的最短引爆时间。

C/C++ 输入输出 long long 时请用 %lld。C++ 可以直接使用 cin/cout 输入输出。

样例一

input
11 2
output
9
explanation

这个数据对应的主板如下所示:                                               显然,我们可以用导线改造成这样:

                                  

这样从左上角到右下角就会有条  {2,2,1,2,2} {2,2,1,2,2} 的电流路径,耗时为  9 9 秒。

样例二

input
99 5 3 7 6 9 1 8 2 4
output
69

限制与约定


【题解】【模拟+枚举】
【一眼没思路。。。】
【思路一】【其实这就是我考场上写的。。。暴力暴力,BFS。。。然后,通过画图可以发现,其实只走一半即可,另一半可以对称求得,赶脚还是蛮科学,但是没写long long挂掉了。。。华丽爆零】
【思路二】【zyf告诉我暴力坐标型dp(只向右、向下) O(n²)+“奇技淫巧”,可以过50分。。。】
【思路三】【zyf最后得了95分,附zyf对其定稿的描述:暴力 O(n2)dp+线段树优化。  然而窝一脸懵逼,Otz zyf】
【正解来袭!】
【显然,当我们尽量走的是最小值,那么是最优的,所以,我们尽量走的是前缀最小值,如果当前层不是最优的,那么我们有两种选择:1)不进入当前层;2)当前层只走2个点(进入下一层和从下一层出来时经过当前层)。但我们在计算时,也只考虑一半
【那么,当我们每次所在的层为当前的前缀最小值时,那么我们从左上进入当前层,走一个“L”型。最优路径即是这些"L"型连接起来】
【考虑到我们还有可能进入下一层得到更优值,但是当我们走到当前层时,不考虑里面的层对答案的影响,我们只考虑在在从最外层到当前层情况下的最优值。再向里走时,如果碰到的不是前缀最小值,我们只记入一个值,表明这一层只计入两个点;如果碰到的是前缀最小值,那么我们使跳蚤在上一个前缀最小值的那层走到可以垂直走到当前层的左上位置所用的时间t*2,并将走到当前层所经过的非前缀最小值时花费的时间tb*2,再加上在当前层从左上走到右下所花费的时间tm加起来求当前最小值】
【一定要记得用long long( ⊙ o ⊙ )啊!】

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll a[100010],n;
ll ans,f[100010];
int main()
{int i,j;scanf("%d",&n); ++n;for(i=n;i>0;--i) scanf("%d",&a[i]);ll minn=a[1],last=1;ll nxt=0; ans=(4*n-3)*a[1];for(i=2;i<=n;++i)if(a[i]<minn){int x=4*(n-i+1)-3;ll sum=f[last]+nxt+minn*(i-last+1);ans=min(ans,sum*2+x*a[i]);f[i]=sum-nxt; last=i; minn=a[i];}else nxt+=a[i];printf("%lld\n",ans);return 0;
}


这篇关于【UOJ 测试】A. 【#244 UER #7】短路(贪心(模拟+枚举))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2878

相关文章

C#实现获得某个枚举的所有名称

《C#实现获得某个枚举的所有名称》这篇文章主要为大家详细介绍了C#如何实现获得某个枚举的所有名称,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... C#中获得某个枚举的所有名称using System;using System.Collections.Generic;usi

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

Rust中的Option枚举快速入门教程

《Rust中的Option枚举快速入门教程》Rust中的Option枚举用于表示可能不存在的值,提供了多种方法来处理这些值,避免了空指针异常,文章介绍了Option的定义、常见方法、使用场景以及注意事... 目录引言Option介绍Option的常见方法Option使用场景场景一:函数返回可能不存在的值场景

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

性能测试介绍

性能测试是一种测试方法,旨在评估系统、应用程序或组件在现实场景中的性能表现和可靠性。它通常用于衡量系统在不同负载条件下的响应时间、吞吐量、资源利用率、稳定性和可扩展性等关键指标。 为什么要进行性能测试 通过性能测试,可以确定系统是否能够满足预期的性能要求,找出性能瓶颈和潜在的问题,并进行优化和调整。 发现性能瓶颈:性能测试可以帮助发现系统的性能瓶颈,即系统在高负载或高并发情况下可能出现的问题

字节面试 | 如何测试RocketMQ、RocketMQ?

字节面试:RocketMQ是怎么测试的呢? 答: 首先保证消息的消费正确、设计逆向用例,在验证消息内容为空等情况时的消费正确性; 推送大批量MQ,通过Admin控制台查看MQ消费的情况,是否出现消费假死、TPS是否正常等等问题。(上述都是临场发挥,但是RocketMQ真正的测试点,还真的需要探讨) 01 先了解RocketMQ 作为测试也是要简单了解RocketMQ。简单来说,就是一个分

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

usaco 1.3 Barn Repair(贪心)

思路:用上M块木板时有 M-1 个间隙。目标是让总间隙最大。将相邻两个有牛的牛棚之间间隔的牛棚数排序,选取最大的M-1个作为间隙,其余地方用木板盖住。 做法: 1.若,板(M) 的数目大于或等于 牛棚中有牛的数目(C),则 目测 给每个牛牛发一个板就为最小的需求~ 2.否则,先对 牛牛们的门牌号排序,然后 用一个数组 blank[ ] 记录两门牌号之间的距离,然后 用数组 an

usaco 1.2 Transformations(模拟)

我的做法就是一个一个情况枚举出来 注意计算公式: ( 变换后的矩阵记为C) 顺时针旋转90°:C[i] [j]=A[n-j-1] [i] (旋转180°和270° 可以多转几个九十度来推) 对称:C[i] [n-j-1]=A[i] [j] 代码有点长 。。。 /*ID: who jayLANG: C++TASK: transform*/#include<

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M