洛谷P2091 排序 數學 置換與迴圈

2021-06-25 13:16:36 字數 774 閱讀 7335

題目描述 description

小a有n個物件排成一排,每個物件有它的體積v和質量m。n個物件的體積在1~n內,且各不相同,但質量可能相同。

現在,小a需要把n個物件按體積從小到大重新排列。他的排序方式是:每次交換兩個物件。這樣會他會消耗的體力值為兩個物件的質量和。

小a想知道,為了將物件排序,他消耗的最少體力值是多少?

輸入輸出格式 input/output

輸入格式:

第一行,乙個正整數n,表示物件的數量。

第二行n個正整數,第i個數表示從左到右第i個物品的體積。

第三行n個正整數,第i個數表示從左到右第i個物品的質量

輸出格式:

乙個數,表示小a消耗的最小體力值

這個題太***坑爹了,居然放在noip普及組模擬賽裡,廈門一中的出題人真是喪心病狂,剛開始以為是貪心,沒想到居然考了置換和迴圈的概念。

為了使排序費用最小,我們需要先找出物品中的最小質量minm,然後找到所有包含重為minm物品的置換環,並找到置換環的長度len,用minm物品依次交換每個置換環中的元素。

#include #include #include #include #define maxn 300000

#define inf 0x3f3f3f3f

using namespace std;

struct thing

{ int v,m,id; //id=-1表示已經歸位

bool operator<(const thing &b)const{return v



洛谷P1347 排序

這個題看到很多人寫topo排序,其實這道題第一眼看更像是乙個差分約束的裸題qwq.令dis x 表示x的相對大小 1是最小,n是最大 顯然,對於乙個關係a 而我們最後要求的就是dis x 的最小值,為了使它們的值都落在1 n之間,我們新建乙個虛擬的點0,並令dis 0 0且dis x dis 0 這...

洛谷 P1347 排序 拓撲排序

題目 乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列a,b,c,d 表示a第一行有兩個整數n,m,n表示需要排序的元素數量,2 n 26,第1到n個元素將用大寫的a,b,c,d 表示。m表示將給出的形如a接下來有m行,每行有3個字元,分別為乙個大寫字母,乙個 ...

洛谷 P1347 排序 拓撲排序

乙個不同的值的公升序排序數列指的是乙個從左到右元素依次增大的序列,例如,乙個有序的數列 a,b,c,da,b,c,da,b,c,d 表示a abc d。在這道題中,我們將給你一系列形如 a a b 的關係,並要求你判斷是否能夠根據這些關係確定這個數列的順序。第一行有兩個正整數 n,mn,mn,m,n...