【模擬】無線網絡發射器選址

(原題傳送門)ios

思路


蒟蒻看到這道題的數據範圍後表示瑟瑟發抖,然而敲完LowLow的Code後發現居然AC了?!!好吧,這道題的數據範圍就是唬人的,拿出草紙計算一下就能發現O(n4)的時間複雜度就能AC,本蒟蒻腦容量有限,表示想不出來也看不懂O(n2)的算法,A完C就跑~~~算法

這道題爲了數組不越界,產生負下標,能夠經過特判來解決,但本蒟蒻採用了更暴力的作法:直接從cross[21][21]開始存儲(n<=20),把沒用到的空間置0,這樣若是訪問小於21的下標能獲得也不過就是0(天才構思,快鼓掌)數組

而後,用一個2重循環來嘗試每個可能的選址,再嵌套一個二重循環來計算每一個選址的「價值」,而後將其與最大值比較,若等於最大值,那麼說明最大的選址方案多了一種,將記錄最大選址方案數的變量sum++,若大於最大值,說明以前全部的最大方案都是假的,存在更大的,將sum歸1,並將最大值設置爲目前值。spa

最後,輸出便可。code

剩下的就是水代碼了QAQ。ci

Code


#include<iostream>
using namespace std;
int x,y,d,n,gkmax,num,sum=1,cross[170][170];
int main()
{
    cin>>d>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>x>>y>>cross[x+20][y+20];
    }
    for(int i=20;i<=148;i++)
        for(int j=20;j<=148;j++)
        {
            for(int m=i-d;m<=i+d;m++)
                for(int k=j-d;k<=j+d;k++)    
                    num+=cross[m][k];
            if(gkmax==num)
            {
                sum++;
            }
            if(gkmax<num)
            {    
                sum=1;
            }
            gkmax=max(gkmax,num);
            num=0;
        }
    cout<<sum<<" "<<gkmax;
    return 0;
}
相關文章
相關標籤/搜索