【模拟】无线网络发射器选址

本文分享了一个看似复杂但实际可用O(n^4)算法解决的选址问题。通过对数据范围的巧妙利用,避免了数组越界问题,采用双重循环遍历所有可能位置,计算其价值并与最大值进行比较,更新最大值和方案数。最终输出最大方案数及最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题传送门

思路


蒟蒻看到这道题的数据范围后表示瑟瑟发抖,然而敲完LowLow的Code后发现竟然AC了?!!好吧,这道题的数据范围就是唬人的,拿出草纸计算一下就能发现O(n4)的时间复杂度就能AC,本蒟蒻脑容量有限,表示想不出来也看不懂O(n2)的算法,A完C就跑~~~

这道题为了数组不越界,产生负下标,可以通过特判来解决,但本蒟蒻采用了更暴力的做法:直接从cross[21][21]开始存储(n<=20),把没用到的空间置0,这样如果访问小于21的下标能得到也不过就是0(天才构思,快鼓掌)

然后,用一个2重循环来尝试每一个可能的选址,再嵌套一个二重循环来计算每个选址的“价值”,然后将其与最大值比较,若等于最大值,那么说明最大的选址方案多了一种,将记录最大选址方案数的变量sum++,若大于最大值,说明之前所有的最大方案都是假的,存在更大的,将sum归1,并将最大值设置为目前值。

最后,输出即可。

剩下的就是水代码了QAQ。

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

转载于:https://www.cnblogs.com/gongdakai/p/11031402.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值