有n個人要參加西洋棋比賽,該比賽要進行k場對弈。每個人最多參加兩場對弈,最少參加零場對弈。每個人都有乙個與其他人不相同的等級(用乙個正整數來表示)。
在對弈中,等級高的人必須用黑色的棋子,等級低的人必須用白色的棋子。每個人最多只能用一次黑色的棋子和一次白色的棋子。為增加比賽的可觀度,觀眾希望k場對弈中雙方的等級差的總和最小。
比如有7個選手,他們的等級分別是30,17,26,41,19,38,18,要進行3場比賽。最好的安排是選手2對選手7,選手7對選手5,選手6對選手4。此時等級差的總和等於(18-17)+(19-18)+(41-38)=5達到最小。
輸入格式 第一行兩個正整數n,k
接下來有n行,第i行表示第i-1個人等級。
[資料規模]
在90%的資料中,1≤n≤3000;
在100%的資料中,1≤n≤100000;
保證所有輸入資料中等級的值小於100000000,1≤k≤n-1。
輸出格式 在第一行輸出最小的等級差的總和。
輸入輸出樣例
輸入複製
7 330
1726
4119
3818輸出5
#include
using
namespace std;
//本題每個人黑白棋最多只能一手,先排序,把相鄰的兩者組合時能盡量最小,再對
intmain()
sort
(a,a+n)
;int b[n-1]
;for
(int i=
0;i1;i++
)sort
(b,b+n-1)
;//然後取差值存入陣列b,從低到高排序
int ans=0;
int m=0;
while
(k--
) cout
return0;
}
題解 P1626 象棋比賽
這道題題解有點少,還沒有c 的 c應該也可以看懂 所以我來發布一篇 核心思路 現將各等級選手進行從小到大的排列,然後假設每人都會進行比賽,算出每相鄰兩人的差 這裡不用再算不相鄰的差了,因為要使和最小,離得最近的兩數才滿足。比如 1 2 3,2 1 1,3 1 2 再將差進行從小到大的排序 然後輸出前...
題解 P1626 象棋比賽
這道題題解有點少,還沒有c 的 c應該也可以看懂 所以我來發布一篇 核心思路 現將各等級選手進行從小到大的排列,然後假設每人都會進行比賽,算出每相鄰兩人的差 這裡不用再算不相鄰的差了,因為要使和最小,離得最近的兩數才滿足。比如 1 2 3,2 1 1,3 1 2 再將差進行從小到大的排序 然後輸出前...
洛谷P1347 排序
這個題看到很多人寫topo排序,其實這道題第一眼看更像是乙個差分約束的裸題qwq.令dis x 表示x的相對大小 1是最小,n是最大 顯然,對於乙個關係a 而我們最後要求的就是dis x 的最小值,為了使它們的值都落在1 n之間,我們新建乙個虛擬的點0,並令dis 0 0且dis x dis 0 這...