問題描述:
位元蘭人都很怪異,他們有一些奇怪的習俗。
為準備「位元蘭狂歡節」,j叔叔讓g和a去把n個雞蛋染成彩色。孩子們很高興,因為他們可以得到一些報酬。
j叔叔要他們給出酬勞的**,g給出了染每只雞蛋的**,a也給出了他染每只雞蛋的**,結果g和a的n只雞蛋**總和恰好是1000塊。
j叔叔想把這些雞蛋分給兩個孩子染色,但他希望支付給a的酬勞總額與支付給g的總額差別不超過500塊。
請問j叔叔期望的分配方案是否可行呢?
輸入格式:
第一行,乙個整數nnn(
1≤n≤
106)
(1\leq n\leq 10^6)
(1≤n≤1
06),表示總共有n只雞蛋
接下來n行,每行兩個整數ai 和 gi (0 ≤ ai, gi ≤ 1000; ai + gi = 1000),ai表示a對第i只雞蛋的**,gi表示g對第i只雞蛋的**
若有多個方案,輸出字典序最小的一種。
輸出格式:
如果找不到可行的方案,輸出-1
否則列印出分配的方案:一行,n個字母,依次對應n只雞蛋的塗色者,若第i只雞蛋是a塗的,列印"a",否則列印"g"
樣例輸入
樣例1:
21 999
999 1
樣例2:
3400 600
400 600
400 600
樣例輸出
樣例1:
ag樣例2:
aag首先糾正一點,「結果g和a的n只雞蛋**總和恰好是1000塊。」意思是對於任意的 i
ii ,ai+
gi
=1000
a_i+g_i=1000
ai+gi
=10
00.這道題看上去挺嚇人的,一百萬的資料範圍,但是其實這是一道貪心水題,連陣列都不用。
我們先讓 g
gg 塗全部雞蛋(這是為了後面的字典序最小),s
ss 表示當前 g
gg 比 a
aa 多得 s
ss 塊報酬。
則一開始 s=∑
i=1i
≤n
gs=\sum_^ g
s=∑i=1
i≤n
g。依次考慮每個雞蛋,對於每個雞蛋,可以讓 a
aa 塗它,也可以繼續讓 g
gg 塗它。如果讓 a
aa 塗這個雞蛋,那麼 s
ss 應該更新為 s−g
i−ai
s-g_i-a_i
s−gi−
ai,由於 ai+
gi
=1000
a_i+g_i=1000
ai+gi
=10
00, 則 s=s
−1000
s=s-1000
s=s−10
00。如果繼續讓 g
gg 塗這個雞蛋顯然 s
ss 不變。
那麼, 只有當 ∑i=
1i≤n
g>n×
1000
+500
\sum_^ g>n\times 1000+500
∑i=1i≤
ng>n×
1000
+500
時,問題無解。而由於 g
i<
1000
g_i < 1000
gi<10
00,則 ∑i=
1i≤n
g≤
1000×n
\sum_^ g \leq 1000\times n
∑i=1i≤
ng≤
1000
×n,因此問題一定有解。
那對於每個雞蛋,由於要求字典序最小,我們肯定希望盡量讓 a
aa 塗它。不管讓 a
aa 塗哪個雞蛋,s
ss 均減少 1000
1000
1000
,所以當 s
≥500
s\geq 500
s≥50
0 時,我們肯定讓 a
aa 塗這個雞蛋。因為當 s
≤500
s\leq 500
s≤50
0 時,∣s−
500∣
>
500\vert s-500 \vert > 500
∣s−500
∣>50
0了,不能再繼續讓 a
aa 塗雞蛋了(他的工錢已經夠多了)。
所以我們可以在輸入後忽略 a
ia_i
ai 和 g
ig_i
gi,達到 o(1
)o(1)
o(1)
的空間複雜度。你沒看錯,**只有9行。
#include
intmain()
21 3 進度事件
事件 說明loadstart 接收到響應的第乙個位元組時觸發 progress 接收響應期間連續觸發 error 請求發生錯誤時觸發 abort 通過 abort 方法終止連線時觸發 load 接收到完整的響應資料時觸發 loadend 通訊完成或觸發 error abort load 事件後觸發 ...
NKOJ 3697 桌球比賽
p3697桌球比賽 時間限制 ms空間限制 65536 kb 評測說明 時限1000ms 問題描述 n個桌球愛好者站成一排,從左往右編號1到n。他們要組織比賽切磋技術。每個人都有乙個不同的技能值,編號i個人的技能值為ai。每場比賽需要3個人 兩名選手,一名裁判。要求作為裁判的那乙個桌球愛好者所站的位...
NKOJ 4224 矩陣計數
p4224矩陣計數 時間限制 ms空間限制 65536 kb 評測說明 1s 問題描述 給出乙個n m的方格矩陣,每個格仔裡都有乙個整數。你有兩種操作 1 x y k 將座標為x,y的格仔的數字改為k 2 x1 y1 x2 y2 k 詢問滿足值為k且座標 x,y x1 x x2 y1 y y2的格仔...