牛牛换道具
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;
}
};