Codeforces Round #735 (Div. 2)

Codeforces Round #735 (Div. 2)

题目链接:Codeforces Round #735 (Div. 2

A. Cherry

题意:给定一个数组,求数组的任意一个一个区间使得其中最大值与最小值乘积最大

解题思路:经过简单的思考可以知道这个答案一定是相邻的,之后就可以轻松解决了

解题代码:

#include <iostream>
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define pii = pair<int,int>
using namespace std;
const int maxn = 3e5 + 10;
int a[maxn];
signed main(){
    int t;
    cin >> t;
    while (t--){
        int n;
        cin >> n;
        int ans = 0;
        for(int i = 1;i<=n;i++)cin >> a[i];
        for(int i = 2;i<=n;i++){
            ans = max(ans,a[i] * a[i - 1]);
        }
        cout << ans <<endl;
    }
    //system("pause");
    return 0;
}

B.Cobb

题意:给定数组,求一个\((i,j)\)使得\(i · j - k ·(a_i | a_j)\)最大

解题思路:与上一题差不多,最大答案一定会在附近105个值内产生,于是,我们每105个取试着取值即可

解题代码:

#include <iostream>
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define pii = pair<int,int>
using namespace std;
const int maxn = 3e5 + 10;
int a[maxn];
const int INF = 1e18;
signed main(){
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int t;
    cin >> t;
    while (t--){
        int n, k;
        cin >> n >> k;
        int ans = -INF;
        for(int i = 1;i <= n;i++)cin >> a[i];
        for (int i = max(1ll, n - 105); i <= n; i++) {
            for (int j = i + 1; j <= n; j++) {
                ans = max(ans, i * j - k * (a[i] | a[j]));
            }
        }
        cout << ans << endl;
    }
    //system("pause");
    return 0;
}

C.Mikasa

题意:给定n和m,求解MEX(\(n⊕0,n⊕1,…,n⊕m\)

解题思路: \(n⊕k = x\)\(n ⊕ x = k\)于是问题反转了,变成找到一个最小的k,使得\(n ⊕ k ≥ m + 1\)​​,从位运算的角度考虑,之后贪心构造即可

解题代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
    int t;
    cin >> t;
    while (t--) {
        int n, m;
        cin >> n >> m;
        int ans = INT_MAX ^ n;
        for (int i = 1 << 30; i; i >>= 1)
            if (ans & i && (ans ^ i ^ n) > m)
                ans ^= i;
        cout << ans << '\n';
    }
}

D.Diane

题意:用小写字母组成一个长度为n的字符串,使得字符串的所有相同子串个数为奇数

解题思路:奇+偶 = 奇,因此用x个a和1个b和x - 1个a凑长度为n的字符串,如果少一位则补c

解题代码:

#include <iostream>
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
#define pii = pair<int,int>
using namespace std;
const int maxn = 3e5 + 10;
int a[maxn];
const int INF = 1e18;
signed main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	int t;
	cin >> t;
	while(t--){
		int n, m;
        cin >> n;
        string ans = "";
        if(n == 1){
            putchar('s');
            putchar('\n');
            continue;
        }else if(n % 2 == 0){
            for(int i = 1;i <= n/2;i++) putchar('s');
            putchar('t');
            for(int i=1;i<n/2;i++)putchar('s');
            putchar('\n');
        }else{
            n--;
            for(int i=1;i<=n/2;i++)putchar('s');
            putchar('t');
            for(int i=1;i<n/2;i++)putchar('s');
            putchar('l');
            putchar('\n');
        }
	}
	return 0; 
}
posted @ 2021-08-01 22:05  0xYuk1  阅读(56)  评论(0)    收藏  举报