zoukankan      html  css  js  c++  java
  • P2280 [HNOI2003]激光炸弹[前缀和]

    题目描述

    img

    输入输出格式

    输入格式:

    输入文件名为input.txt

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

    输出格式:

    输出文件名为output.txt

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

    输入输出样例

    输入样例#1:

    2 1
    0 0 1
    1 1 1
    

    输出样例#1:

    1
    

    解析:

    如你所见,这是一个暴力。

    枚举正方形右下角位置,前缀和优化到(O(n^2)),空间也压一下(这题卡空间)。

    参考代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    #include<string>
    #include<cstdlib>
    #include<queue>
    #include<vector>
    #define INF 0x3f3f3f3f
    #define PI acos(-1.0)
    #define N 5010
    #define MOD 2520
    #define E 1e-12
    using namespace std;
    int sum[N][N],n,R;
    inline int read()
    {
    	int f=1,x=0;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    	return x*f;
    }
    int main()
    {
    	n=read(),R=read();
    	int r=0,c=0;
    	for(int i=1;i<=n;i++){
    		int x,y,v;
    		x=read(),y=read(),v=read();
    		sum[++x][++y]+=v;
    	}
    	for(int i=1;i<=5001;i++)
    	 for(int j=1;j<=5001;j++)
    	 	sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
    	int ans=0;
    	for(int i=0;i<=5000;i++)
    	 for(int j=0;j<=5000;j++)
    	  	if(i>=R&&j>=R)ans=max(ans,sum[i][j]-sum[i][j-R]-sum[i-R][j]+sum[i-R][j-R]);
    	cout<<ans<<endl;
    	return 0;
    }
    
  • 相关阅读:
    多项式A除以B (25分)
    numpy随笔
    numpy中文件读取操作np.loadtxt(),np.savetxt()的使用
    Plug It In
    C. Uncle Bogdan and Country Happiness
    获得系统版本号
    C# Winform无边框窗口拖动
    numericUpDown隐藏上下箭头
    C# FTP下载图片转为Base64
    C# 获取版本号
  • 原文地址:https://www.cnblogs.com/DarkValkyrie/p/11147339.html
Copyright © 2011-2022 走看看