2735. 收集巧克力-迭代更新法

2735. 收集巧克力-迭代更新法

给你一个长度为 n 、下标从 0 开始的整数数组 nums ,表示收集不同巧克力的成本。每个巧克力都对应一个不同的类型,最初,位于下标 i 的巧克力就对应第 i 个类型。

在一步操作中,你可以用成本 x 执行下述行为:

同时修改所有巧克力的类型,将巧克力的类型 ith 修改为类型 ((i + 1) mod n)th。

假设你可以执行任意次操作,请返回收集所有类型巧克力所需的最小成本。

示例 1:

输入:nums = [20,1,15], x = 5
输出:13
解释:最开始,巧克力的类型分别是 [0,1,2] 。我们可以用成本 1 购买第 1 个类型的巧克力。
接着,我们用成本 5 执行一次操作,巧克力的类型变更为 [1,2,0] 。我们可以用成本 1 购买第 2 个类型的巧克力。
然后,我们用成本 5 执行一次操作,巧克力的类型变更为 [2,0,1] 。我们可以用成本 1 购买第 0 个类型的巧克力。
因此,收集所有类型的巧克力需要的总成本是 (1 + 5 + 1 + 5 + 1) = 13 。可以证明这是一种最优方案。

示例 2:

输入:nums = [1,2,3], x = 4
输出:6
解释:我们将会按最初的成本收集全部三个类型的巧克力,而不需执行任何操作。因此,收集所有类型的巧克力需要的总成本是 1 + 2 + 3 = 6 。

博主认为这个题目其实是很特别的一个题目,大家要仔细去看一下题目。
这个解题思路,我来简单写一下,比如,其实,这个题目的关键点在于,某一个类型的巧克力的价格可以使他取得最小值时再去买它,但是当然是需要成本的,所以我们只需要不断地更新全部品种,然后记录它们的价格,最后选择最小的就可以了,解题代码如下:


long long fminz(long long a,long long b){
    if(a>b){
        return b;
    }
    return a;
}
long long minCost(int* nums, int numsSize, int x){
  long long xz=x;
    long long cost_min[numsSize];
    long long all_cost=0;
    for(int i=0;i<numsSize;i++){
        cost_min[i]=nums[i];
        all_cost=all_cost+nums[i];
    }

    for(int j=0;j<numsSize;j++){
         long long new_cost=0;

         for(int i=0;i<numsSize;i++){
                cost_min[i]=fminz(cost_min[i],nums[(i+j+1)%numsSize]);
                new_cost=new_cost+cost_min[i];
                // printf("| %d",cost_min[i]);
        }
        new_cost=new_cost+xz*(j+1);
       // printf("  %d",new_cost);
        all_cost=fminz(new_cost,all_cost);

       
    }
    return all_cost;

   
   
    

}

你可能感兴趣的:(c++与c语言,力扣刷题,算法,java,数据结构)