家人们ac了4个点,帮改下
查看原帖
家人们ac了4个点,帮改下
1069105
nidiewojiadeluosi楼主2024/5/11 19:40

题目要求时间限制:1000ms 内存限制:128MB

大盗杰瑞盯上了一栋有 N 层楼的大厦,大厦的每一层都有 A i ​ 个金币,杰瑞可以在拿走第 i 层楼上的所有金币后,通过楼梯前往大厦的第 i+1 层;

不过有的楼层上可能会有安保人员 (A i ​ =−1),杰瑞为了不被抓到,不能直接越过这些楼层,但是这栋大厦每 K 层有一个电梯,即大厦的 1, K+1, 2K+1, 3K+1, ⋯, j×K+1 (j×K+1≤N) 层上都有一个电梯,杰瑞可以乘坐电梯前往同样拥有电梯的更高楼层(无论该层是否有安保)。

请你计算杰瑞最多可以偷窃到多少金币。

题目保证大厦的第一层不会有安保,且杰瑞只能上楼不能下楼。

每个测试文件包含 T 个测试用例。

数据范围

1≤T≤1000 1≤N, K≤10 5

1≤A 1 ​ ,A i ​ ≤10 9 ∨A i ​ =−1 (2≤i≤N) 题目保证对于所有的测试用例 N 的总和不超过 10 5 。 输入格式 每个测试文件格式如下:

T Testcase 1 ​

Testcase 2 ​

⋮ Testcase T ​

对于每个 Testcase 格式如下:

N K A 1 ​ A 2 ​ A 3 ​ ⋯ A N ​

输出格式 对于每个 Testcase 在单独的一行中输出答案。

样例组 输入#1 4 10 3 3 1 -1 4 30 -1 8 7 3 5 5 1 1 3 7 7 2 10 4 11 4 12 23 -1 55 8 20 7 39 29 4 8 13 -1 3 14 6 1 -1 -1 1 2 26 -1 7 6 -1 7 9 24 3 2 -1 -1 2 19 2 -1 7 1 输出#1 37 20 57 88 提示说明 样例 1: 从 1 楼出发拿到 3 枚金币,乘坐电梯前往 4 楼,拿到 4 枚金币,再通过楼梯到达 5 楼拿到 30 枚金币,一共可以拿到 3+4+30=37 枚金币。

样例 2: 没有任何楼层有安保人员,可以拿到所有 1+3+7+7+2=20 枚金币。

样例 3: 从 1 楼出发拿到 11 枚金币,乘坐电梯前往 9 楼,拿到 7 枚金币,在通过楼梯到达 10 楼拿到 39 枚金币,一共可以拿到 11+7+39=57 枚金币。 我的代码

#include <bits/stdc++.h> 
using namespace std;  
constexpr int N=1e5 + 10;
int n,k;
long long a[N];
int main() {  
    int t;  
    cin >> t;  
    while (t--) {  
        
        cin >> n >> k;  
         for(int i=1;i<=n;i++)cin>>a[i];
        int t=1;long long ans=0;
        while(t<=n){
        	bool flag=1;
            int l=t;
            while(l+1 <=n&&l+1<=t+k-1){
                if(a[l+1]>0)a[++l]+=a[l-1];
                else{
                    flag=0;
                    break;
                }
                ans=max(ans,a[l]);
            }
            t+=k;
            while(t<=n&&a[t]==-1){
                a[t]=a[t-k];
                t+=k;
                flag=0;
            }
            if(t<=n){
                if(flag)a[t]+=a[t-1];
                else a[t]+=a[t-k];
                ans=max(ans,a[t]);
            }
        
        }
        cout<<ans<<endl;
    }  
    return 0;  
}
2024/5/11 19:40
加载中...