M次操作后的最大元素

时间:2014-10-04 04:22:54

标签: c++ algorithm dynamic-programming

给出3个元素N1,N2,N3

现在我们可以对这些元素进行操作。

操作如下:

在单个操作中,我们将选择一个特定元素并将元素的值减少一半(即,如果元素的初始值是x,那么在递减之后它将是x / 2,其中除法是整数除法,例如3 / 2 = 1和4/2 = 2)。同时,其他两个元素的值将增加一个。

现在我们需要最小化最大元素,如果我们可以在ATMOST M秒执行此操作,并且每秒我们可以执行此操作一次。

示例:设N1 = 1,N2 = 2,N3 = 3,M = 1然后这里的答案是3

说明:我们可以选择第3个元素并使其成为一半。请注意,第一个和第二个元素将增加1个单位。所以价值变成2,3,1。这些值的最大值为3.因此答案为3.

我的方法:每次拿起最大的元素,它减少一半,然后将其他两个增加+1。

代码:

long long  ans=max(N1,max(N2,N3));
for(int i=0;i<m;i++){       
    if(N1>=N2 && N1>=N3){
        N1/=2;
        N2++;
        N3++;   
    }
    else if(N2>=N1 && N2>=N3){
        N2/=2;
        N1++;
        N3++;   
    }
    else{
        N1++;
        N2++;
        N3/=2;  
    }
    ans=min(ans,max(N1,max(N2,N3)));
}

失败: 但是让N1 = 8,N2 = 8,N3 = 4,M = 3然后答案是5,这种方法出错了,因为根据提到的算法步骤可能是:

8 8 4 -> 4 9 5 -> 5 4 6 ->  6 5 3

但正确的是:

8 8 4 -> 9 9 2 -> 4 10 3 -> 5 5 4

约束: M介于1和100之间。 N1,N2和N3可以达到10 ^ 9。

0 个答案:

没有答案