A

我们不难发现仅当 时才是 NO,其余均为 YES,证明的话自己枚举一下就可以发现了。

B

我们不难发现:

所以我们把最小的两个数放在第一个和最后一个再进行相加即可,具体实现用快速排序然后相加就行了。

时间复杂度 ,可以通过。

C

简单找一下规律即可。

#include <bits/stdc++.h>
using namespace std;

const int N = 3e5 + 5;
int n, T, a[N], maxn, flag;

int main()
{ 
	cin >> T;
	while (T--)
	{ 
		cin >> n; 
        for (int i = 1; i <= n; i++)
        {
            cin >> a[i]; 
            maxn = max(maxn, a[i]); 
        } 
        for (int i = 1; i <= n; i++)
        { 
            if (maxn == a[i])
            { 
                if (i > 1 && a[i - 1]) flag |= 1;
                if (i < n && a[i + 1]) flag |= 1;
            } 
        } 
        if (flag) cout << maxn <<"\n"; 
        else if (maxn <= 1) cout << -1 << "\n";
        else cout << maxn - 1 << "\n";
        maxn = 0, flag = 0;
    }
    return 0;
}

D

简单贪心,感觉比 C 要简单很多。

#include <bits/stdc++.h>
using namespace std;
#define int long long
 
const int N = 2e5 + 5;
int n, T, a[N], ans1, ans2;
 
signed main()
{ 
    cin >> T;
    while (T--)
    { 
        cin >> n; 
        for (int i = 1; i <= n; i++) cin >> a[i]; 
        sort(a + 1, a + n + 1);
        if(n % 2 == 1)
        {
            for (int i = 1; i < n; i++) ans1 += abs(a[i] - a[(n + 1) / 2]);
            for (int i = 2; i <= n; i++) ans2 += abs(a[i] - a[(n + 1) / 2]);
            cout << min(ans1, ans2) << "\n";
        }
        else
        {
            for (int i = 1; i < n; i++) ans1 += abs(a[i] - a[n / 2]);
            for (int i = 2; i <= n; i++) ans2 += abs(a[i] - a[n / 2]);
            cout << min(ans1, ans2) << "\n";
        }
        ans1 = ans2 = 0;
    }
    return 0;
}

我们只需要把最大值删去,再进行计算即可。然后我们就可以获得

那为什么呢?因为有一些特殊情况我们没考虑到,具体可以参考代码:

#include <bits/stdc++.h>
using namespace std;
#define int long long

const int N = 2e5 + 5;
int n, T, a[N], ans1, ans2;

signed main()
{ 
	cin >> T;
	while (T--)
	{ 
		cin >> n; 
        for (int i = 1; i <= n; i++) cin >> a[i]; 
        sort(a + 1, a + n + 1);
        for (int i = 1; i < n; i++) ans1 += abs(a[i] - a[(n + 1) / 2]);
       	for (int i = 2; i <= n; i++) ans2 += abs(a[i] - a[(n + 1) / 2 + 1]);
        cout << min(ans1, ans2) << "\n";
        ans1 = ans2 = 0;
    }
    return 0;
}

我们发现修改了:

for (int i = 1; i < n; i++) ans1 += abs(a[i] - a[(n + 1) / 2]);
for (int i = 2; i <= n; i++) ans2 += abs(a[i] - a[(n + 1) / 2 + 1]);

两行代码就可以通过了,因为我们这里有两种不同的情况,我们需要把两种不同的情况分别计算出来,再取最小值即可,可以通过。

E

小学奥数题,每进一次位,数字和减九,或者模九也可以。

然后考虑优化,我们可以使用前缀和进行优化时间复杂度。

代码具体实现比较复杂,大家可以自己尝试一下。