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