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。乙個整數表示答案。輸...