牛牛换道具

100分解法

二分,时间复杂度o(logn),空间复杂度o(1)。
首先我们考虑答案是单调的,也就是我们如果能换x个奖品,显然一定能换x-1个奖品。所以我们可以直接二分最后的答案,如果a,b,c比最终奖品数x多的差值的和大于等于a,b,c比最终奖品数x少的差值的和的两倍(因为两个道具才能换一个道具),则答案x是可行的,更新二分的左区间,否则更新二分的右区间。下面是代码:

class Solution {
public:
    /**
     * 返回能交换奖品的最大数量
     * @param a long长整型
     * @param b long长整型
     * @param c long长整型
     * @return long长整型
     */
    long long numberofprize(long long a, long long b, long long c) {
        // write code here
        long long l=min(a,min(b,c));
        long long r=max(a,max(b,c));
        long long pos=-1;
        while(l<=r)
        {
            long long sum=0;
            long long mid=(l+r)/2;
            if(a>=mid)sum+=a-mid;
            else sum-=2*(mid-a);
            if(b>=mid)sum+=b-mid;
            else sum-=2*(mid-b);
            if(c>=mid)sum+=c-mid;
            else sum-=2*(mid-c);
            if(sum<0)r=mid-1;
            else {l=mid+1;pos=mid;}
        }
        return pos;
    }
};
全部评论

相关推荐

点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务