Description

给定一个长度为n的数组a和常数x,其中ai表示种类i的物品价值。

对于物品,存在两种操作:

  • 操作1:花费ai的成本,买入一个种类i的物品。
  • 操作2:花费x的成本,使所有物品种类j变动为(j+1)%n

现在有n个物品,每个种类各一件,求全部买入的最小成本。

Constraints

  • 1n103
  • 1ai109
  • 1x109

Solution

至少有2个结论:

  • 最多执行n1次操作2。
  • r次操作2时得到的成本为i=0nmin_cost_of_itemi+r×x

这里的itemi指的是初始为种类i的物品,随后第k[0,r]次操作2时会转为种类(i+k)%n

因此不断维护itemi最小值即可。

Code

class Solution {
public:
    long long minCost(vector<int>& nums, int x) {
        using L = long long;
        auto n = nums.size();
        auto ans = numeric_limits<L>::max();
        vector mincosts(n, numeric_limits<int>::max());
        for(int r = 0; r < n; ++r) {
            for(int i = 0; i < n; ++i) {
                mincosts[i] = min<L>(mincosts[i], nums[(i+r) % n]);
            }
            auto cost = accumulate(mincosts.begin(), mincosts.end(), L(r) * x);
            ans = min(ans, cost);
        }
        return ans;
    }
};

LeetCode-2735 Collecting Chocolates