馬拉松冰球賽
(marathon.pas/c/cpp)
馬拉松冰球錦標賽的日子就要到了。正如馬拉松冰球比賽中經常出現的那樣,比賽時間
是m分鐘。和常規的冰球比賽一樣,在每一給定時刻,場上兩隊各有6名球員。然而,一
場馬拉松冰球比賽可以持續很長時間,所以教練帶了一群球員,這樣當球員們累了的時候,
他們可以進行替換。
其中乙個名為 ante 的教練是我們故事的主角。ante 帶了n個球員參加比賽。對於每一
個球員,他知道兩個引數:球員的能力值k和耐力值i。
耐力值是指球員參賽的最大總時間。
假設乙個球員先參加 x 分鐘,然後休息,再參加 y 分鐘,他的總參賽時間就是 x+y。當一
個球員的總參賽時間等於其耐力值的時候,他就會感到疲憊,不能繼續參賽,所以這個時候,
就需要其他人來代替他,否則他會暈倒在賽場上,最終被送進醫院
(馬拉松冰球是乙個危險的專案)。
在乙個給定時刻,隊伍的能力值就是當前參賽隊員能力值的總和。ante 並不是乙個偉
大的教練,所以他要求你拿出最初的六名球員和替補球員的方案,以便他能達到每個時刻隊
伍能力值總和的可能的最大值z。保證一定能找到一種方案,使得每個時刻場上都有 6 名球員。
舉個例子,假設比賽時間為 3 分鐘,而第一分鐘隊伍的能力值是 15,第二分鐘隊伍的能力值是 12,第三分鐘隊伍的能力值是 14,z就等於 15+12+14=41。
請注意:在馬拉松冰球賽中是沒有守門員的,因為比賽必須有趣。
【輸入】
第一行輸入兩個正整數 m 和 n(1≤m≤500 000,6≤n≤500000),分別表示比賽的持續時間(以分鐘為單位),和 ante 帶領的球員數量。
接下來 n 行,每行兩個正整數 k 和 i(1≤k≤100 000,1≤i≤m),表示每個球員的能力值和耐力值。
球員按照輸入順序,從 1 到 n 編號。
【輸出】
第一行包含題目要求的可能的最大值 z。
【輸入輸出樣例】
200 6
6600
3 200
4 200
5 200
6 200
7 200
8 200
9 91260
10 3
9 313 9
5 315 9
100 9
3 62 6
1 63 9
1610
100 3
100 3
100 3
100 3
100 2
100 1
50 1
30 2
1 1這道題雖然是一道比較水的題目
但是也然我認識到一些比較重要的東西
如揹包能求出最優值,而一些貪心則會導致演算法錯誤
比如這道題,若直接貪心,那麼就會導致一些值大的運動員無法得到足夠時間發揮,
但是用揹包思想處理的話,就不會產生此類情況,因為用容量減,就不會出現一些選手得不到全部時間發揮
揹包會自我調控到能替代的運動員後面替換之
所以以後遇到類似題目,一定學會轉換思想,換成揹包試試
#include#include#include
using
namespace
std;
typedef
long
long
ll;const
int maxn=500000+10
;struct
my;my a[maxn];
bool cmp(const my &x,const my &y)
intmain()
int p=0
; sort(a+1,a+1+n,cmp);
m*=6
;
for (int i=1;i<=n;i++)
else
if(m>0
) }
printf(
"%lld
",ans);
return0;
}
完全揹包 NOIP2018 貨幣系統
在的國度中共有 n 種不同面額的貨幣,第 i 種貨幣的面額為 a i 你可以假設每一種貨幣都有無窮多張。為了方便,我們把貨幣種數為 n 面額陣列為 a 1.n 的貨幣系統記作 n,a 在乙個完善的貨幣系統中,每乙個非負整數的金額 x 都應該可以被表示出,即對每乙個非負整數 x 都存在 n 個非負整數...
NOIP2018模擬9 15總結
就是這樣 分數100 80 60 240 rank1 暴力真是爽 t1題意 有n個點,m條邊,k個特殊點,邊權為1 求每個點到離他最遠的特殊點的最短距離 nk 10000000 顯然暴力 t1 include define n 300001 using namespace std int i,j,k...
NOIP2018模擬賽2018 10 18 輕功
description 題目背景 尊者神高達進入了基三的世界,作為乙個 mmorpg 做任務是必不可少的,然而跑地圖卻令人十分不爽。好在基三可以使用輕功,但是尊者神高達有些手殘,他決定用梅花樁練習輕功。題目描述 一共有 n 個木樁,要求從起點 0 開始,經過所有梅花樁,恰好到達終點 n,尊者神高達一...