hdu 6383

时间:2023-03-08 20:20:35
hdu 6383

题意是说给定一个序列,能否通过任意次对部分数字 +1,对部分数字 -2的操作使得序列在满足全部非负且任意两元素的差值不超过1的前提下最小值最大,求最大值。

一开始的时候没有注意到整个序列全是非负数,还写了一步判断是否所有正数都有能力将所有负数变正,也就是说所有正数的和是否为负数和的绝对值的两倍......

后来发现序列中没有负数,根本不会出现题目里所说的要输出 -1 的情况.....(至于都是正数为什么就能通过调整满足题中任意两元素差值不超过1这一点,我只能说这是我试了几次得到的结果,才疏学浅,没有能力严谨地去证明).

然后本人的做法是记录整个序列的最小和最大值,显然答案在最小值和最大值之间,用二分的方法调整 mid 的值:

当发现 mid 的值较小,也就是说所有大于 mid 的数仍有提高序列最小值的能力(同时要满足题意),那么就令 l = mid +1;若 mid 的值较大,所有大于 mid 的数无法通过减小自身来提高较小的数时, 则令 r = mid - 1。

 #include <bits/stdc++.h>
using namespace std;
__int64 num[];
int main()
{
int k;
__int64 r,l,mid,temp;
scanf("%d",&k);
while(k--)
{
int n;
scanf("%d",&n);
r = ; l = 1e8;
for(int i = ; i <= n; i++)
{
scanf("%I64d",&num[i]);
r = max(r,num[i]);
l = min(l,num[i]);
}
while(r >= l)
{
mid = (r + l) / ;
temp = ;
for(int i = ; i <= n; i++)
if(num[i] - mid > ) temp += (num[i] - mid) / ;
else temp += num[i] - mid;
if(temp >= ) l = mid + ;
else r = mid - ;
}
printf("%d\n",r);
}
return ;
}