51nod 1287 加农炮(锻炼思维的好题)

题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287

一个长度为M的正整数数组A,表示从左向右的地形高度。测试一种加农炮,炮弹平行于地面从左向右飞行,高度为H,如果某处地形的高度大于等于炮弹飞行的高度H(A[i] >= H),炮弹会被挡住并落在i - 1处,则A[i - 1] + 1。如果H <= A[0],则这个炮弹无效,如果H > 所有的A[i],这个炮弹也无效。现在给定N个整数的数组B代表炮弹高度,计算出最后地形的样子。

例如:地形高度A = {1, 2, 0, 4, 3, 2, 1, 5, 7}, 炮弹高度B = {2, 8, 0, 7, 6, 5, 3, 4, 5, 6, 5},最终得到的地形高度为:{2, 2, 2, 4, 3, 3, 5, 6, 7}。

Input

第1行:2个数M, N中间用空格分隔,分别为数组A和B的长度(1 <= m, n <= 50000)
第2至M + 1行:每行1个数,表示对应的地形高度(0 <= A[i] <= 1000000)。
第M + 2至N + M + 1行,每行1个数,表示炮弹的高度(0 <= B[i] <= 1000000)。

Output

输出共M行,每行一个数,对应最终的地形高度。

Input示例

9 11
1
2
0
4
3
2
1
5
7
2
8
0
7
6
5
3
4
5
6
5

Output示例

2
2
2
4
3
3
5
6
7

解题思路:

炮弹的高度在10^6以内,于是我们可以对每个高度找到它袭击到了哪个位置,很容易想到每个高度袭击的位置

肯定是非递减的,于是可以在线性时间内找到;接着,对于每个炮弹,它只会让它前面的地形高度增加1,也就是

最多只可能改变一个高度的袭击位置,判断更新下就好了。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=50000+1000;
int a[maxn];
int b[maxn];
int c[maxn*20];
int main()
{
    int m,n;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    for(int j=0;j<m;j++)
    scanf("%d",&b[j]);
    int h=0;
    for(int i=0;i<m;i++)
    h=max(h,b[i]);
    int j=0;
    for(int i=0;i<=h;i++)
    {
        while(a[j]<i&&(j<n))
        j++;
        c[i]=j;
    }
    for(int i=0;i<m;i++)
    {
        int te=c[b[i]];
        if(te>0&&te<n)
        {
            a[te-1]++;
            if(c[a[te-1]]>=te)
            c[a[te-1]]=te-1;
        }
    }
    for(int i=0;i<n;i++)
    {
        printf("%d\n",a[i]);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 17:32:20

51nod 1287 加农炮(锻炼思维的好题)的相关文章

51nod 1391 01串(锻炼思维的好题)

题目http://www.51nod.com/onlineJudge/questionCode.html#problemId=1391?iceId=20917 1391 01串 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x <=j, S[i..x]中0比1多,而S[x + 1..j]中1比0多.求满足条件的最长子串长度. Input 一行包含

51nod 1243 排船的问题(锻炼思维的好题)

一个码头中有N艘船和N个木桩,船的长度为2*X,码头的宽度为M,N个木桩的位置(相对码头左岸的位置)会在数据中给出.船和船之间不能重叠,即每艘船的船头不能超过上一艘船的船尾,当然也不能超出码头的两岸.船和木桩之间用绳子连接,并且1个木桩只能栓1条船,绳子的一头拴在木桩上,另一头拴在船的中间.而船中间到木桩的距离,就是所需的绳子的长度.由你根据给出的条件,排列船的位置,使得所用到的最长的绳子最短.输出这个最短的长度,如果码头排不下所有船则输出-1. 例如:N = 3, X = 2, M = 16.

10种锻炼思维的方法,让你大脑更强大!

有人说:穷人穷脑袋,富人富思维: 如何让你的大脑更强大,更具有威力? 其实开拓思维顾名思义就是开发大脑,只要跟开发大脑有关的方法,同样可以用来开拓你的思维. 1.联想法 拿两个A 物体和B物体,一定是不同的哦,关系距离越远越好.然后让孩子想办法用一句话,或者一段话把他们联系在一起. 就像造句,看图写作一样,熟练之后,就用3个物体,4个物体,甚至更多. 当然不一定要规规矩矩去造句,造段.越离谱,效果会越好的.联想就是要突破局限,所以不要限制孩子的想象. 2.观察法 让孩子专注观察一个物体或一个人物

1287 加农炮

1287 加农炮 一个长度为M的正整数数组A,表示从左向右的地形高度.测试一种加农炮,炮弹平行于地面从左向右飞行,高度为H,如果某处地形的高度大于等于炮弹飞行的高度H(A[i] >= H),炮弹会被挡住并落在i - 1处,则A[i - 1] + 1.如果H <= A[0],则这个炮弹无效,如果H > 所有的A[i],这个炮弹也无效.现在给定N个整数的数组B代表炮弹高度,计算出最后地形的样子. 例如:地形高度A = {1, 2, 0, 4, 3, 2, 1, 5, 7}, 炮弹高度B =

51nod 1273 旅行计划——思维题

某个国家有N个城市,编号0 至 N-1,他们之间用N - 1条道路连接,道路是双向行驶的,沿着道路你可以到达任何一个城市.你有一个旅行计划,这个计划是从编号K的城市出发,每天到达一个你没有去过的城市,并且旅途中经过的没有去过的城市尽可能的多(如果有2条路线,经过的没有去过的城市同样多,优先考虑编号最小的城市),直到所有城市都观光过一遍.现在给出城市之间的交通图T,以及出发地点K,你来设计一个旅行计划,满足上面的条件.例如: (K = 2) 第1天 从2到0 (城市 1 和 0 变成去过的) 第2

poj 1837 Balance 动态规划 (经典好题,很锻炼思维)

题目大意:给你一个天平,并给出m个刻度,n个砝码,刻度的绝对值代表距离平衡点的位置,并给出每个砝码的重量.达到平衡状态的方法有几种. 题目思路:首先我们先要明确dp数组的作用,dp[i][j]中,i为放置的砝码数量,j为平衡状态,0为平衡,j<0左倾,j>0右倾,由于j作为下标不能是负数,所以我们要找一个新的平衡点,因为15*20*20 = 7500,所以平衡点设置为7500, 然后我们可以得出动态方程 dp[i][j+w[i]*c[k])+=dp[i-1][j]; #include<c

51nod 1287 线段树

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了. 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define inf 0x3f3f3f3f 4 #define LL long long 5 const int MAX=50005; 6 int A[MAX]; 7 struct SegTree

51nod P1305 Pairwise Sum and Divide ——思路题

久しぶり! 发现的一道有意思的题,想了半天都没有找到规律,结果竟然是思路题..(在大佬题解的帮助下) 原题戳>>https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1305<< 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor(

51Nod 1413 权势二进制 (思维)

题意 : 一个十进制整数被叫做权势二进制, 当他的十进制表示的时候只由0或1组成.例如0, 1, 101, 110011都是权势二进制而2, 12, 900不是.当给定一个n (1<=n<=1,000,000)的时候, 计算一下最少要多少个权势二进制相加才能得到n. 分析 : 由于权势二进制可以在任意一位构造出1或者0, 那我就可以让每一位都在同时减1, 直到某一位变成0, 继续减其他位, 直到全部都等于0.例如 23303, 可以先构造11101进行相减, 使得除了零外的每一位都减1, 减两