激光炸弹(BZOJ1218)
激光炸彈(BZOJ1218)
一種新型的激光炸彈,可以摧毀一個(gè)邊長(zhǎng)為R的正方形內(nèi)的所有的目標(biāo)。現(xiàn)在地圖上有n(N<=10000)個(gè)目標(biāo),用整數(shù)Xi,Yi(其值在[0,5000])表示目標(biāo)在地圖上的位置,每個(gè)目標(biāo)都有一個(gè)價(jià)值。激光炸彈的投放是通過(guò)衛(wèi)星定位的,但其有一個(gè)缺點(diǎn),就是其爆破范圍,即那個(gè)邊長(zhǎng)為R的正方形的邊必須和x,y軸平行。若目標(biāo)位于爆破正方形的邊上,該目標(biāo)將不會(huì)被摧毀。
輸入輸出格式:
輸入文件的第一行為正整數(shù)n和正整數(shù)R,接下來(lái)的n行每行有3個(gè)正整數(shù),分別表示xi,yi,vi
輸出文件僅有一個(gè)正整數(shù),表示一顆炸彈最多能炸掉地圖上總價(jià)值為多少的目標(biāo)(結(jié)果不會(huì)超過(guò)32767)。
輸入樣例:
2 1
0 0 1
1 1 1
輸出樣例:
1
分析:
二維數(shù)組前綴和:一定區(qū)間里價(jià)值之和
\(S[i,j] = S[i-1,j] + S[i,j-1]-S[i-1,j-1]+A[i,j]\)
邊長(zhǎng)R的正方形的價(jià)值(ij為正方形的右下角)
\(P[i,j] = S[i,j] - S[i-R,j] - S[i,j-R] + S[i-R,j-R]\)
然后枚舉正方形右下角找最大值
錯(cuò)誤題解:(TLE MLE一堆 用于理解)
#include<iostream> #define N 5000+5 using namespace std; int A[N][N]={0}; //main函數(shù)里定義上限719 X 719 int S[N][N]={0}; int P[N][N]={0};int main(){int n,r,a,b,m;cin>>n>>r;m= 0;while(n--){int x,y,v;cin>>x>>y>>v;A[x][y] = v;if(m<x) m=x;if(m<y) m=y;}m = (m+r>5000)?5000:m+r;for(int i=0;i<m;i++){for(int j=0;j<m;j++){a = (i-1<0)?0:i-1;b = (j-1<0)?0:j-1;S[i][j] = S[a][j]+S[i][b]-S[a][b]+A[i][j];}}int max = 0;for(int i=0;i<m;i++){for(int j=0;j<m;j++){a = (i-r<0)?0:i-r;b = (j-r<0)?0:j-r;P[i][j] = S[i][j] - S[a][j] - S[i][b] + S[a][b];if(P[i][j]>max)max=P[i][j];}}cout<<max;return 0; }題解:
#include<iostream> #define N 5000+5 using namespace std; int A[N][N]={0}; int main(){int n,r,a,b,c,m;cin>>n>>r;m= 0; // 找個(gè)上限 縮短下運(yùn)行時(shí)間while(n--){int x,y,v;cin>>x>>y>>v;A[x+1][y+1] += v;if(m<x) m=x;if(m<y) m=y;}m = (m+r>5000)?5000:m+r;for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){a = (i-1<0)?0:i-1;b = (j-1<0)?0:j-1;A[i][j] += A[a][j]+A[i][b]-A[a][b];}}int max = 0;for(int i=1;i<=m;i++){for(int j=1;j<=m;j++){a = (i-r<0)?0:i-r;b = (j-r<0)?0:j-r;c= A[i][j] - A[a][j] - A[i][b] + A[a][b];if(c>max)max=c;}}cout<<max;return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/wendiudiu/p/10762170.html
總結(jié)
以上是生活随笔為你收集整理的激光炸弹(BZOJ1218)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如果您遇到文件或数据库问题,如何重置Jo
- 下一篇: mdl文件是c语言,MDL文件扩展名 -