列表

详情


MT49. 路由器

描述

一条直线上等距离放置了 台路由器。路由器自左向右从 到 编号。第 台路由器到第 台路由器的距离为 | i - j |  每台路由器都有自己的信号强度,第 台路由器的信号强度为 ai 。所有与第 台路由器距离不超过 ai 的路由器可以收到第i台路由器的信号(注意,每台路由器都能收到自己的信号)。问一共有多少台路由器可以收到至少k台不同路由器的信号。

数据范围:

输入描述

输入第一行两个数n , k

第二行n个数, a1 , a2 , a3……… , an

输出描述

输出一个数,一共有多少台路由器可以收到至少k台不同路由器的信号。

示例1

输入:

4 4
3 3 3 3

输出:

4

原站题解

C++ 解法, 执行用时: 10ms, 内存消耗: 1832KB, 提交时间: 2020-07-10

/*思想:本题用了差分数组的思想,原来对于一个数组中我们想给[i,j]区间的每一个元素进行加1操作,一个个操作很耗时
,有了差分数组,我们只需要在i处加1,在j+1处减去1即可,最后通过差分数组就可以还原原数组!
差分数组:对于数组[a1,a2,a3,a4...],其差分数组[a1,a2-a1,a3-a2,a4-a3...]。第i项的值等于查分数组前i项的和。*/
#include<iostream>
#include<algorithm>
using namespace std;
long long const a = 0;
const int MAXSIZE = 1e5+2;

int main()
{
    ios::sync_with_stdio(false);
    long long n, k;
    cin >> n >> k;
    long long chafen[MAXSIZE] = {0};
    long long temp;
    for (long long i=0; i<n; i++)
    {
        cin >> temp;
        chafen[max(a, i-temp)]++; // 信号辐射的左边界
        chafen[min(n, i+temp+1)]--; // 信号辐射的右边界
    }
    int sum = 0, res = 0;
    for(long long i = 0; i<n; i++)
    {
        sum = sum + chafen[i];
        if (sum >= k)
        {
            res++;
        }
    }
    cout << res;
    return 0;
}

C++14 解法, 执行用时: 11ms, 内存消耗: 1372KB, 提交时间: 2020-08-20

#define faster ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include <iostream>
#include <algorithm>
using namespace std;


int n, k;
int nums[100001];

//法一:先处理一遍所有路由器的信号左右临界点,再从左到右遍历一遍每个位置的情况。类似leetc_253:会议室 解法
//时间复杂度:O(n)
int main()
{
	faster;
	cin >> n >> k;
	int len;
	for (int i = 0; i < n; ++i)
	{
		cin >> len;
		++nums[max(0, i - len)];     //意思是i-len的位置开始,多了一台路由器可以辐射
		--nums[min(i + len + 1, n)]; //意思是i+len+1的位置开始,少了一台路由器可以辐射
	}

	int num = 0;
	int count = 0;
	for (int i = 0; i < n; ++i)
	{
		num += nums[i];
		if (num >= k)
			++count;
	}

	cout << count;
	return 0;
}

上一题