zoukankan      html  css  js  c++  java
  • BZOJ 1218: [HNOI2003]激光炸弹(二维前缀和)

    Description

    一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。若目标位于爆破正方形的边上,该目标将不会被摧毁。 

    Input

    输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示xi,yi,vi

    Output

    输出文件仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过32767)。

    Sample Input

    2 1
    0 0 1
    1 1 1

    Sample Output

    1
    对着算法进阶指南刷bzoj ,还刷的怎么吃力,我也是真的差菜。
    代码如下
    #include<stdio.h>
    #include<iostream>
    #define N 5000
    using namespace std;
    int sum[5005][5005];
    int n,x,y,v,R,maxn1=0,maxn2=0,maxn=0;
    int main()
    {
    
    //cin>>n>>R;
    scanf("%d%d",&n,&R); 
    for(int i=1;i<=n;i++)
    {
        //cin>>x>>y>>v;
        scanf("%d %d %d",&x,&y,&v);
        sum[x+1][y+1]=v;
    
    }
    for(int i=1;i<=N+1;i++)
    {
        for(int j=1;j<=N+1;j++)
        {
            sum[i][j]=sum[i][j]+sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
         } 
    }
        for(int i=R;i<=N+1;i++)
        {
            for(int j=R;j<=N+1;j++)
            {
                maxn=max(maxn,sum[i][j]-sum[i-R][j]-sum[i][j-R]+sum[i-R][j-R]);
            }
         }
         printf("%d
    ",maxn);
              return 0;
    }

    这个题,有两个容易数组越界的地方。第一个就是输入时,注意要加一,否则sum[i][0]或者sum[0][j]算前缀和时,容易数组越界,还有就是算哪个最大价值是,是从R到N+1。交的崩溃

  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/hh13579/p/10808929.html
Copyright © 2011-2022 走看看