zoukankan      html  css  js  c++  java
  • 从零开始的异世界生活(前缀和)

    Description

    486 作为有史以来最悲惨的男主,我们知道他需要经历一些无限次的死亡和轮回才能进行下一个关卡。

    3915-1

    现在给你 n 个连续的时间点,每个时间点 i 上都会有一个心理伤害值 hurt[i],然后告诉你 m 个死亡时间点 deth[i],以及当前死亡时间点会死亡的次数 num[i],和死亡后 486 会返回的时间点(也就是最近的存档点 return[i])。

    其整个过程就是 486 从时间点 0 开始 (hurt[0] = 0),不断向下一个时间点 1, 2, 3… 前进,当遇到死亡时间点的时候,486 会死亡一次,然后返回到最近的一个存档点,然后会继续从存档点向下一个时间点前进,当又遇到死亡时间点的时候,如果死亡次数还不够需要死亡的次数,那么当前不能过关,继续回到最近的存档点。达到需要死亡的次数之后,便不需要死亡,继续向下一个时间点前进。486 在每一个时间点 i 上都会遭受心理伤害 hurt[i]。为什么 486 的心理防线不会崩溃呢,当然因为有我们的蕾姆酱了,每次受到心理伤害的时候蕾姆酱都会治愈掉。第一季的目标便是走到时间点 n,现在需要你计算一下蕾姆酱的治愈总和(也就是 486 从时间点 0 到时间点 n 所遭受的心理攻击的总和)。

    3915-2

    那么萌萌的蕾姆酱到底治愈了多少呢~她这么萌,你还不快告诉她么~

    Input

    输入数据有多组(数据组数不超过 30),到 EOF 结束。

    对于每组数据:

    • 第一行输入两个以空格分隔的整数 n 和 m
    • n (1 <= n <= 100000) 表示 486 要到达的目标时间点(起始目标点 0,hurt[0] = 0,每次前进一个时间点)
    • 接下来一行输入 n 个以空格分隔的整数,表示 hurt[i]。表示 486 在当前时间点会遭受到的伤害值
    • 接下来输入 m (0 <= m <= n/2) 行,每行 3 个整数,分别是 deth[i],return[i] 和 num[i],表示 deth[i] 时间点需要死亡的次数以及会返回的最近的存档点

    保证:0 <= hurt[i] <= 100,1 <= deth[i-1] < return[i] < deth[i] <= n, 0 <= num[i] <= 100。

    当前时间点如果不需要死亡,那么486不会返回最近的存档点,会继续前进。

    Output

    对于每组数据,输出一个整数,表示蕾姆酱总的治愈值(486 会遭受到的总的伤害值)。

    Sample Input

    10 3
    1 2 3 4 5 5 4 3 2 1
    4 2 1
    6 5 2
    10 9 1
    

    Sample Output

    62




    打比赛的时候看了一眼这个题没看懂什么意思以为会很难,也没有再认真去看,结束后发现是一个很简单的前缀和问题,我和队友都后悔不已啊。

    解题思路:对所给的一组样例解释一下就明白怎么使用的前缀和了,男主受到的所有伤害值为:
    ans[n]是前n项的和,
    (ans[4]-ans[1])+(ans[6]-ans[4])*2+(ans[10]-ans[8])*1+ans[10]


     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4 int main()
     5 {
     6     int n,m,sum,i,a,r,t;
     7     int h[100010];
     8     int ans[100010];
     9     while(scanf("%d%d",&n,&m)!=EOF)
    10     {
    11         sum=0;
    12         for(i=1; i<=n; i++)
    13         {
    14             scanf("%d",&h[i]);
    15         }
    16         for(i=1; i<=n; i++)
    17         {
    18             ans[i]=ans[i-1]+h[i];///前缀和
    19         }
    20         while(m--)
    21         {
    22             scanf("%d%d%d",&a,&r,&t);
    23             sum=sum+(ans[a]-ans[r-1])*t;
    24         }
    25         sum=sum+ans[n];
    26         printf("%d
    ",sum);
    27     }
    28     return 0;
    29 }
     
  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9350040.html
Copyright © 2011-2022 走看看