在你窗外闪耀的星星

本文解析了一道洛谷OJ上的经典算法题——星星亮度问题(P3353),通过前缀和的方法高效求解在特定窗口范围内星星亮度之和的最大值。文章回顾了题目背景,描述了问题的输入输出格式,并提供了详细的解题思路及代码实现。

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

在 你 窗 外 闪 耀 的 星 星 在你窗外闪耀的星星 耀

题目链接: l u o g u   P 3353 luogu\ P3353 luogu P3353

题目背景

飞逝的的时光不会模糊我对你的记忆。难以相信从我第一次见到你以来已经过去了 3 年。我仍然还生动地记得,3 年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀着你玫瑰色的脸颊。我明白,我已经沉醉于你了。之后,经过几个月的观察和窥探,你的优雅与智慧,你对待生活的态度和你对未来的愿望深切地在我心中留下了印象。你是迷人的阳光女孩,我总是梦想着与你分享余生。唉,实际上你远远超过了我最疯狂的梦想。我不知道如何桥起我与你之间的鸿沟。所以我没有任何计划,仅仅只是等待,等待一个适当的机会到来。直到现在,毕业的到来,我意识到我是个傻瓜,我应该创造机会并且抓住它而不只是等待。

这些日子里,我和我的朋友、室友、同学一个接一个地分开。我仍无法相信,在挥手之后,这些熟悉的面孔很快就会从我们的生活中消失,仅仅留下回忆。我明天就将离开学校。你已经计划远走高飞,追求你的未来,实现你的梦想。如果没有命运,也许我们不会再次相遇。所以今晚,我正在你的宿舍楼下徘徊,希望能偶然遇见你。但矛盾的是,你的美貌一定会使我心跳加速,我笨拙的舌头也许无法吐出一个字。我不记得我曾多少次经过你的宿舍楼,每次都希望看到你出现在阳台上或是窗台上。我不记得这个想法曾多少次在我的脑海中涌出:打电话叫她一起吃晚饭或是聊聊天。但每次,考虑到你的优秀和我的平凡,胆怯的优势超越勇气驱使我静静地离开。

毕业,意味着中学生活的终结。这些光荣与浪漫的时代结束。你可爱的微笑是我原来努力学习的动力,这单相思的爱情会被密封,作为一个我心灵深处的记忆。毕业,也意味着新生活的开始,一个到达光明未来的足迹。我真希望你在国外天天开心,一切顺利。同时,我将努力从幼稚中走出来,变得更加成熟。我的理想将是在现实中追求我的爱与幸福,我永远不会放弃。

再见了,我的公主!

如果有一天,在某个天涯海角,我们有机会相聚,即使是白发苍苍的男人和女人,在那个时候,我希望我们可以成为好朋友来自豪地分享这个记忆,重温年轻快乐的激情。如果这个机会永远没有到来,我希望我是天空中的星星,在你的窗外闪烁。远远地保佑着你,就像一个朋友,每天晚上陪伴在你左右,一同分享甜美的梦亦或是一同经历可怕的梦。

题目

现在问题来了:天空可以理解为一条数轴,在这条数轴上分布着许多颗星星,对于每颗星星都有它的位置 X i X_i Xi和自身的亮度 B i B_i Bi。而窗户所能看到的范围是一个给出的参数 W W W,我们看到的星星也包括窗户边缘的星星。现在,要你求出调整窗户位置后能看到星星的亮度之和最大值。

输入

一行 N N N , W W W,分别代表星星的数量和窗户的宽度

余下 N N N 行,输入 X i X_i Xi B i B_i Bi ,代表星星的坐标和亮度

输出

一个数字,代表能看到星星的最大亮度和

样例输入

6 3
1 2
2 4
3 8
4 4
5 2
1000 1

样例输出

16

样例解释

在这里插入图片描述
对于 10 % 10\% 10% 的数据, W = 0 W=0 W=0(没有边缘)

对于 40 % 40\% 40% 的数据, W ≤ 1000 W\leq 1000 W1000

对于 100 % 100\% 100% 的数据, 1 ≤ N ≤ 100000 , 0 ≤ W ≤ 100000 , 1 ≤ X i ≤ 100000 , 1 ≤ B i ≤ 100 1 \leq N\leq 100000,0 \leq W\leq 100000,1 \leq X_i\leq 100000,1\leq B_i\leq 100 1N100000,0W100000,1Xi100000,1Bi100 W = 0 W=0 W=0 的情况外, W W W 均为 ≥ 3 \geq 3 3 的奇数

思路

这道题的背景好强啊…

但是!这道题我一开始竟然以为只能用线段树,再看一下标签,发现有只有线段树和贪心。

结果做了一半发现前缀和直接就可以了。

……
    ( 表 示 很 淦 )    {\color{white} ~~_{(表示很淦)}~~ }     
所以这道题其实很好做,直接简单的前缀和就完事了。
不过要记得就是一个坐标可能会不止一个星星,所以我们可以把一个坐标的星星亮度累加起来,不要用直接重新赋值的方法。

代码

#include<cstdio>
#include<iostream>

using namespace std;

int n, m, a[100001], x, y, b[100001], ans;

int main() {
	scanf("%d %d", &n, &m);//读入
	for (int i = 1; i <= n; i++) {
		scanf("%d %d", &x, &y);//读入
		a[x] += y;//计算出每一个坐标的总亮度
	}
	
	if (m == 0) {//没有窗子
		printf("0");
		return 0;
	}
	
	for (int i = 1; i <= 100000; i++)
		b[i] = b[i - 1] + a[i];//处理出前缀和
	
	for (int i = m; i <= 100000; i++)
		ans = max(ans, b[i] - b[i - m]);//直接模拟每一个窗户的位置可以得出的答案
	
	printf("%d", ans);//输出
	
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值