在你窗外閃耀的星星

耀在你窗外閃耀的星星

題目鏈接:luogu P3353luogu\ P3353

題目背景

飛逝的的時光不會模糊我對你的記憶。難以相信從我第一次見到你以來已經過去了 3 年。我仍然還生動地記得,3 年前,在美麗的集美中學,從我看到你微笑着走出教室,你將頭向後仰,柔和的晚霞照耀着你玫瑰色的臉頰。我明白,我已經沉醉於你了。之後,經過幾個月的觀察和窺探,你的優雅與智慧,你對待生活的態度和你對未來的願望深切地在我心中留下了印象。你是迷人的陽光女孩,我總是夢想着與你分享餘生。唉,實際上你遠遠超過了我最瘋狂的夢想。我不知道如何橋起我與你之間的鴻溝。所以我沒有任何計劃,僅僅只是等待,等待一個適當的機會到來。直到現在,畢業的到來,我意識到我是個傻瓜,我應該創造機會並且抓住它而不只是等待。

這些日子裏,我和我的朋友、室友、同學一個接一個地分開。我仍無法相信,在揮手之後,這些熟悉的面孔很快就會從我們的生活中消失,僅僅留下回憶。我明天就將離開學校。你已經計劃遠走高飛,追求你的未來,實現你的夢想。如果沒有命運,也許我們不會再次相遇。所以今晚,我正在你的宿舍樓下徘徊,希望能偶然遇見你。但矛盾的是,你的美貌一定會使我心跳加速,我笨拙的舌頭也許無法吐出一個字。我不記得我曾多少次經過你的宿舍樓,每次都希望看到你出現在陽臺上或是窗臺上。我不記得這個想法曾多少次在我的腦海中湧出:打電話叫她一起喫晚飯或是聊聊天。但每次,考慮到你的優秀和我的平凡,膽怯的優勢超越勇氣驅使我靜靜地離開。

畢業,意味着中學生活的終結。這些光榮與浪漫的時代結束。你可愛的微笑是我原來努力學習的動力,這單相思的愛情會被密封,作爲一個我心靈深處的記憶。畢業,也意味着新生活的開始,一個到達光明未來的足跡。我真希望你在國外天天開心,一切順利。同時,我將努力從幼稚中走出來,變得更加成熟。我的理想將是在現實中追求我的愛與幸福,我永遠不會放棄。

再見了,我的公主!

如果有一天,在某個天涯海角,我們有機會相聚,即使是白髮蒼蒼的男人和女人,在那個時候,我希望我們可以成爲好朋友來自豪地分享這個記憶,重溫年輕快樂的激情。如果這個機會永遠沒有到來,我希望我是天空中的星星,在你的窗外閃爍。遠遠地保佑着你,就像一個朋友,每天晚上陪伴在你左右,一同分享甜美的夢亦或是一同經歷可怕的夢。

題目

現在問題來了:天空可以理解爲一條數軸,在這條數軸上分佈着許多顆星星,對於每顆星星都有它的位置 XiX_i和自身的亮度 BiB_i。而窗戶所能看到的範圍是一個給出的參數WW,我們看到的星星也包括窗戶邊緣的星星。現在,要你求出調整窗戶位置後能看到星星的亮度之和最大值。

輸入

一行 NN , WW,分別代表星星的數量和窗戶的寬度

餘下 NN 行,輸入 XiX_iBiB_i ,代表星星的座標和亮度

輸出

一個數字,代表能看到星星的最大亮度和

樣例輸入

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

樣例輸出

16

樣例解釋

在這裏插入圖片描述
對於 10%10\% 的數據,W=0W=0(沒有邊緣)

對於 40%40\% 的數據,W1000W\leq 1000

對於 100%100\% 的數據,1N100000,0W100000,1Xi100000,1Bi1001 \leq N\leq 100000,0 \leq W\leq 100000,1 \leq X_i\leq 100000,1\leq B_i\leq 100W=0W=0 的情況外,WW 均爲 3\geq 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;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章