题目链接
https://codeforces.com/problemset/problem/1496/B
题解
分类:
思维,分类讨论
思路:
刚看了大佬的代码,感觉我的思路略微复杂了一点点
首先对数组进行升序排序,然后找数组不同的元素个数sum
分类1:如果第一项不等于0,则若四舍五入(a[n-1]/2)在原数组中存在,则无论k多少,结果都是sum
如果a[n-1]/2,则当k不为0时,无论k多大,结果都是sum+1
分类2:第一项等于0,且数组中每一个元素都是连续的,则结果为k+sum
若第一项等于0且数组不是连续,则找出查找四舍五入(mex+max),找到,则结果为sum,找不到,结果为sum+1
我的代码:
有一说一,复杂了点,用了二分
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 10;
double a[maxn];
int round_number(double number)
{
return (number > 0.0) ? (number + 0.5) : (number - 0.5);
}
int Binary_Search(double *a, int n, int key)
{
/*low为数组下限,high为数组上限,mid为中值*/
int low, high, mid;
low = 0; /*定义最低下标为记录首位*/
high = n - 1; /*定义最高下标为记录末位*/
while (high >= low)
{
mid = (low + high) / 2; /*折半*/
if (key < a[mid]) /*若查找值比中值小*/
high = mid - 1;
else if (key > a[mid]) /*若查找值比中值大*/
low = mid + 1;
else
return mid; /*若相等则说明mid即为查找到的位置*/
}
return -1;
}
int main()
{
int n, k, i, t;
cin >> t;
while (t--)
{
int flag = 1, index = 0;
int sum = 1;
cin >> n >> k;
for (i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
for (i = 0; i < n - 1; i++)
{
if (a[i] != a[i + 1])
sum++;
}
for (i = 0; i < n - 1; i++)
{
if (a[i] != a[i + 1] - 1)
{
flag = 0;
index = i;
break;
}
}
if (k == 0)
sum += 0;
if (k > 0)
{
if (a[0] != 0)
{
if (Binary_Search(a, n, round_number(a[n - 1] / 2)) >= 0)
sum += 0;
else
sum++;
}
else if (a[0] == 0)
{
if (flag)
sum = sum + k;
else
{
if (Binary_Search(a, n, round_number((a[index] + 1 + a[n - 1]) / 2)) >= 0)
sum += 0;
else
sum += 1;
}
}
}
cout << sum << "\n";
}
return 0;
}