首页 > 其他 > 详细

激光炸弹结题报告

时间:2021-02-01 21:47:26      阅读:29      评论:0      收藏:0      [点我收藏+]
激光炸弹
【问题描述】
一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。若目标位于爆破正方形的边上,该目标将不会被摧毁。
【输入格式】输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示xi,yi,vi。
【输出格式】
输出文件仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过32767)。
【样例输入】
2 1
0 0 1
1 1 1
【样例输出】
1
 
 
 
这是典型的二维前缀算法,利用容斥原理进行计算。
首先计算边界矩形的值
1 for(int i=2;i<=4999;i++){//这里从2开始是防止数组越界
2         map[1][i]+=map[1][i-1];
3         map[i][1]+=map[i-1][1];
4     }    

 

技术分享图片
A+B+C+D=A+(B+D)+(C+D)-D
所以可以推到map[i][p]=map[i][p]+map[i-1][p]+map[i][p-1]-map[i-1][p-1]
最后再从i,p=r开始更新值
A=A+B+C+D-(C+D)-(B+D)+D
 
最后上代码
 1 #include <cstdio>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <ctime>
 7 using namespace std;
 8 int map[5100][5100]={0};
 9 int n,r,maxa=0,maxb=0,maxnum=0;
10 inline int Read()//快读 虽然这个题貌似没有必要
11 {
12     int r = 0;
13     char c = getchar();
14     while (!isdigit(c)) c = getchar();
15     while (isdigit(c)) {r = r * 10 + c - 0; c = getchar();}
16     return r;
17 }
18 int main()
19 {
20     n=Read();r=Read();
21     for(int i=0;i<=n-1;i++)
22     {
23         int a,b;
24         a=Read();b=Read();
25         map[a+1][b+1]=Read();
26         if(a>maxa) maxa=a;
27         if(b>maxb) maxb=b; //记录max是为了省时间
28     }
29     for(int i=2;i<=4999;i++){
30         map[1][i]+=map[1][i-1];
31         map[i][1]+=map[i-1][1];//初始化边界
32     }    
33     for(int i=2;i<=maxa+100;i++)
34     for(int p=2;p<=maxb+100;p++)
35     {
36         map[i][p]=map[i][p]+map[i-1][p]+map[i][p-1]-map[i-1][p-1];//计算
37     }
38     for(int i=r;i<=maxa+100;i++)
39     for(int p=r;p<=maxb+100;p++)
40     {
41         int num=map[i][p]-map[i-r][p]-map[i][p-r]+map[i-r][p-r];
42         if(num>maxnum) maxnum=num;//更新最大值
43     }
44     printf("%d",maxnum);
45     return 0;
46 } 

 

激光炸弹结题报告

原文:https://www.cnblogs.com/taotianzhufang/p/14359025.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!