传送门

A New Palindrome

就判断回文串中出现的字母种类是不是大于1

#include<bits/stdc++.h>

//#define int long long
#define fi first
#define se second

using namespace std;

const int N = 100010;
const int M = 998244353;

int n, m;
int a[N];
int b[N];

void solve() {
    string s;
    cin >> s;
    map<char, int> mp;
    for (int i = 0, j = (int) s.size() - 1; i < j; i++, j--) {
        mp[s[i]]++;
    }
    //cout<<mp.size()<<endl;
    if (mp.size() == 1)puts("No");
    else puts("Yes");
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int h_h;
    cin >> h_h;
    //h_h = 1;
    while (h_h--)solve();
    return 0;
}

B Maximum Sum

其实就是枚举所有的情况,选最大的即可,我们可以从左往右枚举,先按照从大到小排个序,用两个指针i,j分别表示删最大值最小值的位置,最开始是全部删最大的,如何删两个较小的,其他删最大的,然后是四个最小的,其他是最大的直到,全部删最小的,再遍历过程中用前缀和来求区间和更新最大值。

#include<bits/stdc++.h>

#define int long long
#define fi first
#define se second

using namespace std;

const int N = 200010;
const int M = 998244353;

int n, m;
int a[N];
int b[N];

void solve() {
    cin >> n >> m;
    int sum = 0;
    for (int i = 1; i <= n; i++)cin >> a[i];
    sort(a + 1, a + n + 1);
    for (int i = 1; i <= n; i++)b[i] = b[i - 1] + a[i];
    int ans = 0;
    for (int l = 1, r = n - m; r <= n; l += 2, r++)ans = max(ans, b[r] - b[l - 1]);
    cout << ans << endl;
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int h_h;
    cin >> h_h;
    //h_h = 1;
    while (h_h--)solve();
    return 0;
}

C Contrast Value

其实最本质就是求山峰山谷的数量因为要判断前后各一个和本身的大学情况,所以我们总第二个元素开始,所以第一个和最后一个元素就没有判断,最后的答案还要加上二。

#include<bits/stdc++.h>

#define int long long
#define fi first
#define se second

using namespace std;

const int N = 300010;
const int M = 998244353;

int n, m;
int a[N];

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++)cin >> a[i];
    vector<int> b;
    b.push_back(a[1]);
    for (int i = 2; i <= n; i++) {
        if (a[i] == b.back())continue;
        b.push_back(a[i]);
    }
//    for (auto i: b)cout << i << ' ';
//    cout << endl;
    if (b.size() == 1) {
        cout << 1 << endl;
        return;
    }
    int ans = 0;
    for (int i = 1; i < b.size() - 1; i++) {
        if ((b[i] > b[i - 1] && b[i] > b[i + 1]) || (b[i] < b[i - 1] && b[i] < b[i + 1]))ans++;
    }
    cout << ans + 2 << endl;
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr), cout.tie(nullptr);
    int h_h;
    cin >> h_h;
    //h_h = 1;
    while (h_h--)solve();
    return 0;
}