1. 程式人生 > >【ZCMU1578】自習教室(思維)

【ZCMU1578】自習教室(思維)

題目連結

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;
}