首页 > 试题广场 >

最优屏障

[编程题]最优屏障
  • 热度指数:47 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
MNH[i]()ij(i<j)MHMHM,M

输入描述:
第一行包含一个正整数T(T≤20)。
对于每组数据,第一行包含一个正整数n(2≤n≤50000)。
接下来n个不同的正整数,H1,H2,H3,…,Hn(0≤Hi≤109)分别代表横截面上每座山的海拔高度。
(读入数据比较大,建议使用scanf而不要使用cin读入)
对于60%的数据,n≤500
对于80%的数据,n≤5000
对于100%的数据,n≤50000


输出描述:
每组数据输出一行形如“Case #N: X C”,N代表当前是第N组数据(从1开始),X代表屏障放置在第X座山前可使M国的防守能力下降最多, 此时减少量为C。若有多种方案使得减少量为C,那么输出最小的X对应的方案。
示例1

输入

2
3
2 1 3
5
4 5 2 6 3

输出

Case #1: 2 2
Case #2: 3 2
头像 __y__
发表于 2020-10-13 16:39:12
思路 插入屏障就是将一个区间分割成两个区间[1,x]和[x+1,n],所以我们可以利用栈来求出前缀的对数和、后缀的对数和,然后在一个for循环来寻找最大值,减少的最大防守力就是[1,n] - [1,x] - [x+1,n],最优的屏障放置位置就是当前的x+1。 代码 #include <b 展开全文
头像 QWQ-ea
发表于 2023-09-19 17:08:23
计算每座山作为一个相互监视点间的区间左端点和中间点的的次数(除作为区间右端点外),然后取次数最多的那一个,其左端点即为答案。 #include<bits//stdc++.h> using namespace std; long long int Min(long long int 展开全文

问题信息

难度:
0条回答 926浏览

热门推荐

通过挑战的用户

最优屏障