日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

CF1380D.Berserk And Fireball 【2000】你值得学习的【思维】+【模拟】+【贪心】

發(fā)布時(shí)間:2023/12/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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>14<54<54<5,剛好小的都是需要?jiǎng)h除的)

想法:因此我們需要根據(jù)各種操作的魔力值消費(fèi)情況進(jìn)行貪心。

題解

  • 我們將該數(shù)組序列進(jìn)行一下劃分,劃分為多個(gè)區(qū)間,這是為了根據(jù)不同區(qū)間的長(zhǎng)度考慮進(jìn)行操作1還是操作2,參考上面的疑問(wèn)1。
  • 我們?cè)O(shè)區(qū)間長(zhǎng)度為 LLL
  • 當(dāng)L<kL< kL<k時(shí),區(qū)間最大值大于左右端點(diǎn),則無(wú)解,這是因?yàn)榇笾凳悄阆胍麥绲?#xff0c;你卻沒(méi)有辦法通過(guò)操作2進(jìn)行消滅,如果區(qū)間最大值不大于左右端點(diǎn), 魔法消耗就是 L * y,(兩個(gè)值消滅一個(gè)值,需要消滅長(zhǎng)度為L(zhǎng),即L * y,這里不太理解可以看一下單調(diào)隊(duì)列)
  • 當(dāng)L>=kL>=kL>=k時(shí),區(qū)間最大值大于左右端點(diǎn),那么我們可以進(jìn)行操作2花費(fèi)x的魔力值,消滅長(zhǎng)度為k的戰(zhà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)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。