NOIP2017提高A組集訓10 21 Dark

2021-08-09 22:20:28 字數 2240 閱讀 5195

lichking 希望收集**的黑暗力量,並依靠它稱霸世界。

世間的黑暗力量被描述成乙個長度為n 的非負整數序列,每次它可以選擇這個序列中的兩個相鄰的正整數,讓他們的值同時減一併獲得一點**力量,直到不存在滿足條件的數。

然而你不希望他能夠得逞,所以你會使得他收集的能量盡可能少。

1<=n<=1e5,1<=∑n

i=1a

i <=5e6

考場去擼第三題了,這題沒有仔細想,其實這題是比第三題水的。

第一種方法:

1<=∑n

i=1a

i <=5e6這個提醒太明顯了。

所以可以隨手設出fi

,j,0

/1表示第i個剩下j,第i-1個是否為0。fi

,j,0

=min

(fi−

1,a[

i]−j

,0,f

i−1,

a[i]

−j,1

)+a[

i]−j

(a[i

]−j<=a[

i−1]

) fi

,j,1

=min

(fi−

1,k,

0)+a

[i]−

j(a[

i−1]

>=

k>=a[

i]−j

) a

ns=m

in(f

n,k,

0(a[

n]>=

k>=0)

,fn,

0,1)

第二種方法:

可以注意到最後的序列每兩個數一定為0,即連續四個數會出現兩個0。

所以設f

i 為a[i]=0且1-i合法最小代價. fi

=min

()1.fi

−1+a

[i]

2.fi−

2+a[

i]3.fi

−3+m

ax(a

[i−1

],a[

i])

… i-4以下的轉移要確定把4個數弄合法的最小代價,由於連續四個數以上會出現至少2個0,我只用由第二個0轉移過來,而不用從第乙個0轉移過來,因為第乙個0會轉移到第二個0去,由第乙個0轉移過來的情況已經在前3種轉移中出現過了,所以i-4以下的轉移是不必要的。 最後a

ns=m

in(f

n,fn

−1) 。

於是得到了乙個虐爆tj的o(n)做法。

這個做法的關鍵在於最終形成序列的性質,算是比較好的思路了。

code(1):

#include

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define fd(i, x, y) for(int i = x; i >= y; i --)

#define min(a, b) ((a) < (b) ? (a) : (b))

using

namespace

std;

const

int n = 1e5 + 5, m = 5e6 + 5;

int n, a[n], o, f[2][m][2];

int main()

int mi = 1e9;

fo(j, a[i] + 1, a[i - 1]) mi = min(mi, f[!o][j][0]);

fo(j, 0, a[i])

}int ans = f[o][0][1];

fo(i, 0, a[n]) ans = min(ans, f[o][i][0]);

printf("%d", ans);

}

code(2):

#include

#define fo(i, x, y) for(int i = x; i <= y; i ++)

#define min(a, b) ((a) < (b) ? (a) : (b))

#define max(a, b) ((a) > (b) ? (a) : (b))

using

namespace

std;

int n, a[100005], f[100005];

int main()

printf("%d", min(f[n], f[n - 1]));

}

NOIP2017提高A組集訓10 21 總結

今天和學軍 雅禮的dalao們一起切磋,感覺他們太強了。接到題目 t1 一定存在著什麼規律。於是我後來打了個表找了一下規律 顯然 部分大佬們想到t1的部分分的dp 強 t2 一看就知道很可能是dp。我dp很爛,所以先打30分暴力再說。打完之後去想60分。我又根據暴力發現了在遞增序列裡,剩下的後面的數...

NOIP2017提高A組集訓10 30 總結

今天幹了些什麼 看到第一題,我蒙b了 感覺這題之前在 見過,記得好像是將圖斜過來看還是怎樣的。於是去看第二題。第二題乙個很顯然的做法,將邊排序,然後暴力建mst。然而我將時間複雜度多算了乙個0,以為不能過,結果我多加了乙個用來騙分的東西,結果這個騙分的東西打錯了,要騙分的那兩個資料都沒過。55555...

NOIP2017提高A組集訓10 22 幸運值

校慶志願者小z在休息時間和同學們玩卡牌遊戲。一共有n張卡牌,每張卡牌上有乙個數ai,每次可以從中選出k張卡牌。一種選取方案的幸運值為這k張卡牌上數的異或和。小z想知道所有選取方案的幸運值之和除以998244353的餘數。輸入的第一行有兩個整數n和k。第二行有n個整數,表示序列a。乙個整數表示答案。輸...