洛谷 象棋比賽(P1626,排序)

2021-10-08 04:54:47 字數 976 閱讀 6054

有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 這...