【ZCMU1578】自習教室(思維)
阿新 • • 發佈:2018-11-10
1578: 自習教室
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 261 Solved: 26
[Submit][Status][Web Board]
Description
快期末了,小明要開始預習課本了,作為一名愛玩的學渣,他需要找一個相對最安靜的位置來學習,然而圖書館還是會有一些人不安分的發出噪音,現在給出一張n*m的矩陣來表示圖書館的狀態。如果這個點是0則表示這個對應的位置為空,如果不是0則表示這裡有個會發出噪音係數為a的人存在,噪音是會隨著距離的增加而降低的,降低的幅度等於距離,兩個點的距離用|x1-x2|+|y1-y2|表示
Input
多組測試資料
第一行包含兩個數字n和m和k(0<n,m<100,0<=k<=n*m)表示圖書館的長和寬
接下來k行,每行三個數字i,j,s(0<=i<n,0<=j<m,0<s<10)表示噪音源的座標以及噪音係數
Output
輸出最安靜的位置i,j(表示i行j列)以及受到的噪音指數是多少,如果有多個答案輸出i最小的,若i一樣輸出j最小的
Sample Input
3 3 1 1 1 3
Sample Output
0 0 1
HINT
Source
【解題思路】
因為直接做是會超時的,所以考慮到對於聲源(x,y)在x軸方向和y軸方向只有距離(x,y)1到s-1的距離才有可能受到影響,所以先預處理一下x軸和y軸方向,至於其他方向也是同理,因為題目中說噪音是會隨著距離的增加而降低的,降低的幅度等於距離,兩個點的距離用|x1-x2|+|y1-y2|表示,其實就已經將這個絕對值表示式化簡成了i+j,所以只要i+j<s則說明這個地方是會受聲源影響的,最後更新一下最小值即可。
【程式碼】
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int maxn=105;
int a[maxn][maxn];
int main()
{
int n,m,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(a,0,sizeof(a));
while(k--)
{
int x,y,s;
scanf("%d%d%d",&x,&y,&s);
a[x][y]+=s;
for(int i=1;i<s;i++)
{
if(x-i>=0)a[x-i][y]+=s-i;
if(x+i<n)a[x+i][y]+=s-i;
if(y-i>=0)a[x][y-i]+=s-i;
if(y+i<m)a[x][y+i]+=s-i;
}
for(int i=1;i<s;i++)
{
for(int j=1;j<s;j++)
{
if(i+j<s)
{
if(x-i>=0 && y-j>=0)a[x-i][y-j]+=s-i-j;
if(x+i<n && y+j<m)a[x+i][y+j]+=s-i-j;
if(x-i>=0 && y+j<m)a[x-i][y+j]+=s-i-j;
if(x+i<n && y-j>=0)a[x+i][y-j]+=s-i-j;
}
}
}
}
int ans=INF,ansi=0,ansj=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j]<ans)
{
ans=a[i][j];
ansi=i;
ansj=j;
}
}
}
printf("%d %d %d\n",ansi,ansj,ans);
}
return 0;
}