2020牛客多校第三場 E

2021-10-08 19:53:56 字數 1480 閱讀 7421

給你乙個a序列,讓你求出對於某個p序列和q序列,pi!=qi 使得它們花費的費用最少。

對於p序列的定義,可以知道,下標和值是交換的,即對於 i,j 這兩個位置,有

pi = j, pj = i,p(pi) = i,p(pj) = i.-> 即如果p

ip_i

pi​ 為 j,那麼p

jp_j

pj​ 一定為i, 即讓a陣列裡面的的兩個數相減 a

ia_i

ai​ - a

ja_j

aj​ 和 a

ja_j

aj​ - a

ia_i

ai​.

對於費用的計算,我們知道,只有兩個值差不多相同的減去才可能最小。

故把a sort一遍,此時構造p,上面對p序列的定義和對費用計算的理解,知道,只需要將p按1~n構造後,再把相鄰的交換一下,就可以的到p陣列.

還是1 - n 的序列,q陣列為了滿足次小,交換首尾,其他的兩兩交換 -> 意思就是讓a的末尾減去首位,其他和p一樣相鄰相減。

例如,1~n的序列為 1 2 3 4 5 6

p: 2 1 4 3 6 5

q: 6 3 2 5 4 1

現在來計算費用, 當n等於2時 p和q會相等,故為inf。

當n等於4時把計算公式寫出來後 可得到 2*(a4 - a1)

當n等於6的時候 ,得到 2* (a6 - a1)

當n等於8的時候,可以拆分成2個4長度的因為對於q序列a

8a_8

a8​ - a

1a_1

a1​ > a

8a_8

a8​ - a

5a_5

a5​ + a

4a_4

a4​ - a

1a_1

a1​。10的時候可以拆分成4和6長度的

…設dp[i]為以i結尾時的最少花費。

**:

#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

#include

#define int long long

using

namespace std;

typedef pair<

int,

int> pii;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;const

double eps =

1e-5

;const

int mod =

998244353

;const

int n =

200010

;int dp[n]

,a[n]

;signed

main()

return0;

}

2020牛客多校第三場

沒有魚,沒有魚餌 沒有魚,有魚餌 有魚,沒魚餌 有魚,有魚餌 每個只能做其中乙個操作,如果在某個點之前已經拿過魚餌,還沒用,就能拿個魚,如果在某個點有魚,就能拿個魚。現在問最多能拿多少條魚?思路 貪心,如果有魚那肯定拿魚,魚 1,然後就剩0和1操作了,如果遇到1操作,直接拿魚餌,遇到0操作,看有沒有...

Magic Line(牛客多校第三場)

magic line 首先我先把所有的點按照先橫座標後縱座標 都是由小到大 然後由於題目給的範圍很大,我們可以想到,如果取一條最為豎的線,那麼一定能分開,然後考慮一下最中間的兩個點橫座標相同的情況即可。include include include include include include i...

2019牛客多校第三場

給乙個01字串,求0和1個數相同的最長子序列和子串長度。子串行長度就是 min cnt 0 cnt 1 2 子串的長度也是原題,記錄一下0和1個數差的字首和,然後用乙個陣列記錄前面掃過的0個數和1個數差值的最左位置,字首和的思想更新答案即可。include using namespace std c...