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 }
     
  • 相关阅读:
    剑指Offer_08_跳台阶
    剑指Offer_07_斐波那契数列
    HDU 4283 You Are the One
    1B. Spreadsheets
    1A Theatre Square
    HDU 2476 String painter(记忆化搜索, DP)
    LightOJ 1422 Halloween Costumes(记忆化搜索)
    POJ 1651 Multiplication PuzzleDP方法:
    POJ 2955 Brackets (区间DP)
    HDU 5452 Minimum Cut
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/9350040.html
Copyright © 2011-2022 走看看