CF1380D.Berserk And Fireball 【2000】你值得学习的【思维】+【模拟】+【贪心】
生活随笔
收集整理的這篇文章主要介紹了
CF1380D.Berserk And Fireball 【2000】你值得学习的【思维】+【模拟】+【贪心】
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
鏈接
CF1380D.Berserk And Fireball
題意
- 存在 nnn 個(gè)戰(zhàn)士
- 兩種技能
- 第一種,消費(fèi) xxx 點(diǎn)魔力值,消滅連續(xù)的 kkk 個(gè)戰(zhàn)士
- 第二種,消費(fèi) yyy 點(diǎn)魔力值,選擇兩個(gè)連續(xù)戰(zhàn)士,戰(zhàn)斗力大的消滅戰(zhàn)斗力小的
- 經(jīng)過(guò)消費(fèi)魔力的多次兩種操作,使得 aaa 數(shù)組變成 bbb 數(shù)組,問(wèn)最少需要花費(fèi)的魔力值是多少?
- 若無(wú)法使 aaa 數(shù)組變成 bbb 數(shù)組,則輸出 ?1-1?1
- 兩種操作圖示方框顏色是不相同的,希望能夠有好的閱讀體驗(yàn)。
樣例輸入
5 2
5 2 3
3 1 4 5 2
3 5
樣例輸出
8
解釋
- 原數(shù)組
- 1、4 兩元素恰好長(zhǎng)度為2,于是我們進(jìn)行1操作,花費(fèi)x(5)魔力值消滅連續(xù)的k(2)個(gè)戰(zhàn)士
- 5、2兩元素的小值恰好是我們需要?jiǎng)h除的2,且單一2元素的長(zhǎng)度為1不合適進(jìn)行操作1,所以選擇操作2進(jìn)行,花費(fèi)魔力值3
- 最后所花費(fèi)的魔力值為 8 = 5 + 3
以上圖示符合樣例1的輸出情況
無(wú)解情況
樣例輸入
4 4
5 1 4
4 3 1 2
2 4 3 1
樣例輸出
-1
很明顯相同長(zhǎng)度的兩個(gè)數(shù)組,元素的相對(duì)位置完全不同已經(jīng)不能通過(guò)操作1、2進(jìn)行改變了,因?yàn)椴僮?、2都沒(méi)有改變?cè)氐南鄬?duì)位置。
疑問(wèn)1
為什么不進(jìn)行操作2?(那好,我們來(lái)嘗試下操作2消滅【1,4】的情況)
結(jié)果:
總花費(fèi):6魔力值>5魔力值(操作1)
歸納:這么說(shuō)來(lái)操作2也不是不行,主要取決于我操作1和操作2的魔力值單次消耗情況和能否進(jìn)行刪除(因?yàn)樵谶@樣例中是恰好3>13>13>1且4<54<54<5,剛好小的都是需要?jiǎng)h除的)
想法:因此我們需要根據(jù)各種操作的魔力值消費(fèi)情況進(jìn)行貪心。
題解
注意:程序中途中的乘積會(huì)爆int
代碼
/* * n個(gè)戰(zhàn)士 * 兩種技能 1.x 魔力值 ,連續(xù)消滅k個(gè)戰(zhàn)士 2.y魔力值,選擇兩個(gè)連續(xù)戰(zhàn)士,戰(zhàn)斗力大的消滅戰(zhàn)斗力小的 * ai -> bi */ const int maxn = 2e5 + 50; int a[maxn], b[maxn]; LL x, k, y; int n, m; bool solve(int l, int r, LL &ans){bool judge = false; //當(dāng)L< k時(shí),區(qū)間最大值大于左右端點(diǎn),則無(wú)解;if (l > r) return true;//我們區(qū)間的有解和無(wú)解是通過(guò)判斷區(qū)間中最大值的情況來(lái)解決的,因此我們需要尋找最大值int maxIndex = l;int L = r - l + 1; //區(qū)間長(zhǎng)度FOR_1(i, l, r) if (a[i] > a[maxIndex]) maxIndex = i;//和左右端點(diǎn)值進(jìn)行比較if (l - 1 >= 1 && a[l - 1] > a[maxIndex]) judge = true;if (r + 1 <= n && a[r + 1] > a[maxIndex]) judge = true;if (L < k && !judge) return false;//need removeint need = L % k;ans += need * y;L -= need;//疑問(wèn)1的解決辦法if (y * k >= x) { ans += L / k * x; }else if(judge) { ans += L * y; } else { //其中長(zhǎng)度k進(jìn)行操作1,剩下進(jìn)行操作2ans += (L - k) * y + x;}return true; } int main(){RD(n, m); RD(x, k, y);FOR_1(i, 1, n) RD(a[i]); FOR_1(i, 1, m) RD(b[i]);int i = 1, j = 1;LL ans = 0; //需要花費(fèi)的魔力值//把b的部分都篩選出來(lái),也就是b的下標(biāo)j需要走到int p = 0;while(j <= m){while(i <= n && a[i] != b[j]) i++;if (i > n) return printf("-1\n") * 0; //b都沒(méi)全部得出a就沒(méi)了,說(shuō)明存在問(wèn)題不可能成立,直接-1就好if (!solve(p + 1, i - 1, ans)) return printf("-1\n") * 0;p = i, j++;}if (!solve(p + 1, n, ans)) return printf("-1\n") * 0;printf("%lld\n", ans);}總結(jié)
以上是生活随笔為你收集整理的CF1380D.Berserk And Fireball 【2000】你值得学习的【思维】+【模拟】+【贪心】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为老总任正非给公司患抑郁症员工的一封信
- 下一篇: 追忆信息论之父-香农博士