0325上午阿里笔试第二题做法分享
题目:
牛牛今年上幼儿园了,老师叫他学习减法。老师给了他五个数字,他每次操作可以选择其中的四个数字减一,减一之后的数字不能小于零——因为幼儿园的牛牛还没有接触过负数。
现在牛牛想知道,自己最多可以进行多少次这样的操作?
输入:
2 5 4 3 2 1 1 1 1 10000 1输出:
3 1
这个题数据范围较大,不能使用过于暴力的方法。
考虑到如果可以取x次,那么肯定可以取x-1次,满足二分的单调性,所以尝试二分。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
ll a[10];
bool ck(ll x)
{
ll s=0;
for(int i=1;i<=5;i++)
if(a[i]<x)
s+=x-a[i];
if(s>x)
return 0;
return 1;
}
int main()
{
int T;
cin >> T;
while(T--)
{
for(int i=1;i<=5;i++)
cin >> a[i];
ll l=1,r=1.3e9;
while(l<r)
{
ll mid=(l+r+1)>>1;
if(ck(mid))
l=mid;
else
r=mid-1;
}
cout << l << endl;
}
}
check函数的原理:
每次选四个减1相当于选一个数不动,剩下的减1,所以考虑每个数最少的不动的次数,a[i]-x如果小于0说明需要某几次不减才能不变成负数,把这个次数做一个计数和x比较即可。
#阿里笔试##笔试题目##阿里巴巴#
阿里巴巴灵犀互娱公司福利 668人发布
查看27道真题和解析