本文主要是介绍【UOJ 测试】A. 【#244 UER #7】短路(贪心(模拟+枚举)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
A. 【UER #7】短路
“第七套广播体操,原地踏步——走!”
众所周知,跳蚤们最喜欢每天早起做早操,经常天还没亮就齐刷刷地站在操场做着反复纵跳热热身。跳晚国在研制三星 note7 的时候注意到了这点,于是他们打算让炸弹更快地引爆,这样就可以消灭更多早起的跳蚤。
三星 note7 的主板可以看作是由 (2n+1)×(2n+1) 个中继器构成的,某些中继器会有导线连在一起,左上角和右下角的中继器分别连着电源的正负极。
电流流过一根导线的时间可忽略不计,但当电流经过中继器时,会延缓一段时间再从中继器流出。这个时间只跟该中继器本身有关,我们把这段时间的长度称为中继器的延时值。
这些中继器由导线连接围成一个一个的层,同个层的中继器的种类都一样,而不同层的种类都不一样,可以发现总共有 n+1 层。当 n=4
时,主板大概长这样:
跳晚们打算再加几根导线将某些中继器连接起来.凭借发达的重工业,他们能生产出无数条导线。但由于主板的限制,他们的导线只能和主板四周的边平行,且其长度只够连接相邻两个中继器。
现在他们想知道,他们改造的三星 note7 的电源正极流出的电流能在多短的时间到达电源负极从而造成短路,这样电池就会释放出巨大的能量摧毁跳蚤国的有生力量了。
请参考输入格式和样例配图来更好地理解题意。
输入格式
第一行一个正整数 n 。
第二行 n+1 个正整数 a0,a1,…,an ,表示从内到外每层的中继器的延时值,单位为秒。其中,第 i 行第 j 列的中继器的延时值为(1<=i,j<=n)
输出格式
输出一行一个数表示改造后的最短引爆时间。
C/C++ 输入输出 long long 时请用 %lld
。C++ 可以直接使用 cin/cout 输入输出。
样例一
input
11 2
output
9
explanation
这个数据对应的主板如下所示: 显然,我们可以用导线改造成这样:
这样从左上角到右下角就会有条 {2,2,1,2,2} 的电流路径,耗时为 9 秒。
样例二
input
99 5 3 7 6 9 1 8 2 4
output
69
限制与约定
#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】短路(贪心(模拟+枚举))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!