【題意】:
\color}
【題意】:
【思路】:
\color}
【思路】:
我國偉大的數學家華羅庚說過:「退,足夠地退,退到最原始而不失重要性的地方,那是學號數學的乙個訣竅。」
這句話意思是當我們想不出正解時,我們可以先考慮這題的簡化形式,然後再逐步轉移到正解。這句話當然也可以用到 oi
\texttt
oi 上,比如這題。
簡化情況
\color}
簡化情況
我們先考慮 n=2
n=2n=
2 時的情況。即兩行的數列分別為 a,b
\texttt
a,b。
首先將 a,b
\texttt
a,b 從小到大排序,這樣做可以簡化我們對問題的處理(這也是乙個非常常用的技巧)。
如何求 n=2
n=2n=
2 時的解呢?我們列舉 i,j
i,ji,
j,表示我們考慮將 ai+
bj
a_i+b_j
ai+bj
加入我們的候選佇列中,分情況討論:
考慮如何快速地維護上述操作。我們發現,我們可以用乙個大根堆維護這個所謂的候選佇列。為什麼是大根堆?因為用大根堆可以很方便地刪除最大的元素。
這樣,我們就搞定了 n=2
n=2n=
2 時的情況。
回到原題
\color}
回到原題
如何從 n=2
n=2n=
2 的情況轉移到 n
>
2n>2
n>
2 時的情況呢?
很簡單,我們把前 2
22 行的答案放入乙個陣列 c
cc 中,把第 i
ii 行(i
ii 表示當前處理的行號)的數放入陣列 d
dd 中。然後就回到了 n=2
n=2n=
2 時的情況。
【**】:
\color}
【**】:
struct big_root_heap
inline
void
push
(int x)
}//在大根堆中加入乙個元素
inline
void
pop()}
//在大根堆中刪除最大值(即根)
inline
intsize()
inline
inttop()
}q;int n,m,k,a[
830]
,b[830];
inline
void
calc_first_kth()
else
break
;//否則,直接進入下層迴圈,優化,否則tle
for(
int i=
1;i<=k;i++
) a[k-i+1]
=q.top()
,q.pop()
;}intmain()
for(
int i=
1;i<=k;i++
)printf
("%d "
,a[i]);
return0;
}幾個需要注意的地方:
1. 這道題不能用 stl,否則會 tle,必須手寫大根堆
2. 建議大家把資料結構分裝到乙個結構體或類中,如果需要用到多個同一資料結構時,優勢明顯。
3.calc_first_kth
() 中的 else
break 不能少,否則會 tle
4. 本程式沒有反作弊系統
2019 08 18 日常總結
一本通1599 題意 在一年前贏得了小鎮的最佳草坪比賽後,fj 變得很懶,再也沒有修剪過草坪。現在,新一輪的最佳草坪比賽又開始了,fj 希望能夠再次奪冠。然而,fj 的草坪非常髒亂,因此,fj 只能夠讓他的奶牛來完成這項工作。fj 有 nn 只排成一排的奶牛,編號為 11 到 nn。每只奶牛的效率是...
5059日常總結
1.乙個函式的形參是const char 實參是可以是char 如果乙個函式的返回值是const char 不能用char 來接收返回值 2.為什麼沒有靜態的建構函式和析構函式?建構函式成員函式使用現有分配構造指定的物件 即存在this。static成員函式指定物件沒有儲存,因此沒有關聯的例項要構造...
2019 10 01日常總結
前言 今天是祖國母親70歲生日,請允許我向祖國母親說一聲 生日快樂!願您永遠繁榮昌盛 山清水秀!題意 松鼠的新家是一棵樹,前幾天剛剛裝修了新家,新家有n nn個房間,並且有n 1 n 1n 1根樹枝連線,每個房間都可以相互到達,且倆個房間之間的路線都是唯一的。天哪,他居然真的住在 樹 上。松鼠想邀請...