列表

详情


NC232732. 禅

描述

骑士?只是我手上的傀儡而已,冲锋!

本题请格外注意标红和加粗的字!

你是一个骑士,现有一个包含 N 个格子的一维棋盘(一行 N 列)。

i 个格子有一个战斗力为 a_i 的怪物:所有怪物对应的 ,若 表示第 i 列是公主。

你的任务目标是营救被困于该格的公主(走到公主所在的格子),你需要选择一个 公主不在 的格子作为起点,任意时刻 重复 经过已经走过的点。

到达某个格子时,必须与当前怪物战斗,如果战斗力严格大于其战斗力,可以击败它并获得它所具有的全部战斗力。

形式化地,设你的战斗力是 m,怪物的战斗力是 a_i



给定序列 ,求采用最优策略选择起点及行动路径时 最少 的初始战斗力 m_0 使得能完成任务目标。

输入描述

全文第一行输入一个正整数 ,表示数据组数。

对于每组数据,第一行输入一个正整数

第二行输入 n 个整数,第 i 个表示

数据保证存在且仅存在一个 i 满足

输出描述

对于每组数据,输出一行一个整数表示 m_0 的最小值,无解时输出一行字符串 

示例1

输入:

2
5
1 2 3 4 0
5
4 4 4 4 0

输出:

2
5

说明:

所有的样例均从第一个格子开始遍历,一路向右即可。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 715ms, 内存消耗: 43996K, 提交时间: 2022-07-15 20:38:44

import sys
input=sys.stdin.readline  

for _ in range(int(input())):
    n=int(input())
    a=list(map(int,input().split()))
    if n==1:
        print('No Solution')
        continue
    gz=a.index(0)
    ansr=ansl=max(a)+1
    right=0
    for i in range(gz)[::-1]:
        now=max(a[i]+1,right-a[i])
        right=now
        ansl=min(ansl,now)

    right=0
    for i in range(gz+1,n):
        now=max(a[i]+1,right-a[i])
        right=now
        ansl=min(ansl,now)
    print(ansl)

C++ 解法, 执行用时: 316ms, 内存消耗: 1428K, 提交时间: 2022-05-28 17:43:49

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N],g[N];
int t,n,k;
int main()
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		for(int i=0;i<n;i++)
		{
		scanf("%d",&g[i]);
		if(g[i]==0)
		k=i;
	}
	int ans=1e9;
	f[k]=0;
	for(int i=k-1;i>=0;i--)
    {f[i]=max(f[i+1]-g[i],g[i]+1);
	ans=min(ans,f[i]);}
	for(int i=k+1;i<n;i++)
    {f[i]=max(f[i-1]-g[i],g[i]+1);
	ans=min(ans,f[i]);}
	if(ans==1e9)
    cout<<"No Solution"<<endl;
    else
    cout<<ans<<endl;
}
return 0;
}

上一题