給你乙個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...