1496B Max and Mex

题目链接

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值