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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 2212. 射箭比赛中的最大得分(状态枚举)

發布時間:2024/7/5 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 2212. 射箭比赛中的最大得分(状态枚举) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

Alice 和 Bob 是一場射箭比賽中的對手。比賽規則如下:

Alice 先射 numArrows 支箭,然后 Bob 也射 numArrows 支箭。

分數按下述規則計算:

  • 箭靶有若干整數計分區域,范圍從 0 到 11 (含 0 和 11)。
  • 箭靶上每個區域都對應一個得分 k(范圍是 0 到 11),Alice 和 Bob 分別在得分 k 區域射中 ak 和 bk 支箭。
  • 如果 ak >= bk ,那么 Alice 得 k 分。如果 ak < bk ,則 Bob 得 k 分
  • 如果 ak == bk == 0 ,那么無人得到 k 分。

例如,Alice 和 Bob 都向計分為 11 的區域射 2 支箭,那么 Alice 得 11 分。如果 Alice 向計分為 11 的區域射 0 支箭,但 Bob 向同一個區域射 2 支箭,那么 Bob 得 11 分。

給你整數 numArrows 和一個長度為 12 的整數數組 aliceArrows ,該數組表示 Alice 射中 0 到 11 每個計分區域的箭數量。
現在,Bob 想要盡可能 最大化 他所能獲得的總分。

返回數組 bobArrows ,該數組表示 Bob 射中 0 到 11 每個 計分區域的箭數量。且 bobArrows 的總和應當等于 numArrows 。

如果存在多種方法都可以使 Bob 獲得最大總分,返回其中 任意一種 即可。

示例 1:

輸入:numArrows = 9, aliceArrows = [1,1,0,1,0,0,2,1,0,1,2,0] 輸出:[0,0,0,0,1,1,0,0,1,2,3,1] 解釋:上表顯示了比賽得分情況。 Bob 獲得總分 4 + 5 + 8 + 9 + 10 + 11 = 47 。 可以證明 Bob 無法獲得比 47 更高的分數。

示例 2:

輸入:numArrows = 3, aliceArrows = [0,0,1,0,0,0,0,0,0,0,0,2] 輸出:[0,0,0,0,0,0,0,0,1,1,1,0] 解釋:上表顯示了比賽得分情況。 Bob 獲得總分 8 + 9 + 10 = 27 。 可以證明 Bob 無法獲得比 27 更高的分數。提示: 1 <= numArrows <= 10^5 aliceArrows.length == bobArrows.length == 12 0 <= aliceArrows[i], bobArrows[i] <= numArrows sum(aliceArrows[i]) == numArrows

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/maximum-points-in-an-archery-competition
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

2. 解題

  • 用 12位的 int 表示 bob 能贏下來的位置
  • 分別檢查需要的 箭的數量是否足夠,取出得分最大的狀態即可
class Solution { public:vector<int> maximumBobPoints(int numArrows, vector<int>& aliceArrows) {int maxscore = 0, ans_state = 0;for(int state = 1; state < (1<<12); ++state){int needarrows = 0, score = 0;for(int j = 0; j < 12; ++j){if((state>>j)&1) // bob 要取得 j 的得分{needarrows += aliceArrows[j]+1;//至少需要比alice多一個箭score += j;}}if(needarrows <= numArrows && score > maxscore){maxscore = score;ans_state = state;}}vector<int> ans(12, 0);int usedarrows = 0, idx = -1;for(int i = 0; i < 12; ++i){if((ans_state>>i)&1){ans[i] = aliceArrows[i]+1;usedarrows += ans[i];idx = i; // 贏的一個位置}}int leftarrows = numArrows - usedarrows;ans[idx] += leftarrows;//剩余的箭隨便找個位置放上return ans;} };

52 ms 9.6 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 2212. 射箭比赛中的最大得分(状态枚举)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。