zoukankan      html  css  js  c++  java
  • 激光炸弹

    题目描述

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

    现在你的任务是计算一颗炸弹最多能炸掉地图上总价值为多少的目标。
     

    输入

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

    输出

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

    样例输入

    2 1
    0 0 1
    1 1 1

    样例输出

    1

    分析:矩阵前缀和~

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <queue>
    #define range(i,a,b) for(int i=a;i<=b;++i)
    #define LL long long
    #define rerange(i,a,b) for(int i=a;i>=b;--i)
    #define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
    using namespace std;
    int n,r;
    int dp[5050][5050],ans;
    void init(){
        cin>>n>>r;
        fill(dp,0);
    }
    void solve(){
        if(!r){cout<<0<<endl;return;}
        range(i,1,n){
            int x,y,z;
            cin>>x>>y>>z;
            dp[x+1][y+1]=z;
        }
        range(i,1,5001)range(j,1,5001)dp[i][j]+=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
        range(i,r,5001)range(j,r,5001)ans=max(ans,dp[i][j]-dp[i-r][j]-dp[i][j-r]+dp[i-r][j-r]);
        cout<<ans<<endl;
    }
    int main() {
        init();
        solve();
        return 0;
    }
    AC代码
  • 相关阅读:
    使用vue自定义组件以及动态时间
    vue案列
    解决adb devices无法连接夜神模拟器
    手动解除浏览器跨域限制
    HBuilder实现WiFi调试Android
    Spring mvc文件下载
    3大框架Struts、Hibernate、Spring简单了解
    简单了解ajax
    使用本地计划任务定时关闭azure虚拟机
    调整虚拟机的尺寸
  • 原文地址:https://www.cnblogs.com/Rhythm-/p/9317774.html
Copyright © 2011-2022 走看看