Good Bye 2020 B

Good Bye 2020 B

大意

给你 (N) 个正整数,你可以将一个数加一(一个数仅能进行一次)或不变。

问最多可以得到几个互不相同的数。

思路

现将原数组排序,从大到小考虑。

对于最大的数,肯定贪心将其加一。

考虑次大数,如果它和(加一后)最大的数相差大于一,那么肯定贪心的将其加一,累加答案。

如果它的最大的数相差等于一,那么肯定不会修改,累加答案。

考虑第三大的数,如果和次大的数(可能进行了操作),相差大于一,修改。

如果相差等于一,不修改,累加答案。

如果和次大的数相等,不修改,不累加答案。

代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;

#define ll long long
#define ull unsigned long long
#define cint const int&
#define Pi acos(-1)

const int mod = 998244353;
const int inf_int = 0x7fffffff;
const ll inf_ll = 0x7fffffffffffffff;
const double ept = 1e-9;

int t, n;
int a[100100];

int main() {
    ios::sync_with_stdio(false);
    cin >> t;
    while(t--) {
        int ans=0;
        cin >> n;
        for(int i=1; i<=n; i++) cin >> a[i];
        a[n+1] = 0;
        sort(a+1, a+1+n);
        for(int i=n; i; i--) if(a[i+1] != a[i]){
            if(a[i+1] != a[i]+1) ++a[i];
            ++ans;
        }
        cout << ans << endl;
    }
    return 0;
}
/*
2
7
1 2 3 4 5 5 5
7
1 2 3 4 5 5 5
*/

9min,-1

原文地址:https://www.cnblogs.com/ullio/p/14215926.html