随便写写

A

img
此题较为简单,主要考察基本语法

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin >> s;
    if(s == "Sunny"){
        cout << "Cloudy" << endl;
    }
    else if(s == "Cloudy"){
        cout << "Rainy" << endl;
    }
    else {
        cout << "Sunny" << endl;
    }
    return 0;
}

B

img
一道模拟题,主要需要把题意读懂

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    string s;
    cin >> s;
    for(int i = 0; i < s.size();i++){
        if(i % 2 == 0){
            if(s[i] == 'L') {
                cout << "No" << endl;
                return 0;
            }
        }
        else {
            if(s[i] == 'R'){
                cout << "No" << endl;
                return 0;
            }
        }
    }
    cout << "Yes" << endl;
    return 0;
}

C

img
img
主要考察思维

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 5;
int vis[N];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,k,q;
    cin >> n>> k >> q;
    
    for(int i = 1; i <= q; i++){
        int p;
        cin >> p;
        vis[p]++;
    }
    for(int i = 1; i <= n; i++){
        if(k - q + vis[i] > 0){
            cout << "Yes" << endl;
        }
        else cout << "No" << endl;
    }
    return 0;
}

D

img
img
利用优先队列实现的贪心

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m;
    cin >> n >> m;
    priority_queue<int> pri;
    for(int i = 1; i <= n; i++)
    {
        int p;
        cin >> p;
        pri.push(p);
    }
    while(m--){
        int x = pri.top();
        pri.pop();
        x /= 2;
        pri.push(x);
    }
    int res = 0;
    while(!pri.empty()){
        res += pri.top();
        pri.pop();
    }
    cout << res << endl;
    return 0;
}

E

暂不做点评

F

img
题目中是求异或和,很容易能想到线性基,关键在于如何去运用

第一个比较难想的点是,我们需要先求出来所有数的异或和sum,或者换句话说,我们需要知道这n个数转换到个二进制位之后,每一个二进制位 1的个数。
假设,在某一个二进制位,( sum >> i ) & 1的值为1,这意味着无论怎么分组,两个集合的异或值sumA 和 sumB 在这一个二进制位上必定是一个 0和一个 1,而在最终得到的值ans 中,这一个二进制位上的值也就必定是1。

而在 (sum>>i )&1 的值为 0的二进制位上,我们当然希望sumA 和sumB 在这一位上均为 1,这样可以使最终值更大。那么就从高位到低位遍历,然后贪心即可。

这里还有一个细节,去除(sum>>i)&1 的值为1的二进制位的影响之后,因为sumA⊕sumB=sum,然后sumA 和sumB 每一个二进制位不是都为0 就都为1,也就是说,sumA=sumB (这里说的单指去掉值为1 的二进制位之后的值),不考虑之前固定的1的影响
那么只需要贪心求出线性基中任意元素异或的最大值即可。

注意,这里所有的操作都建立在去除(sum>>i)&1 的值为 1的二进制位的影响之后,因此原数组中的数在插入线性基之前,必须去除相应二进制位上的值。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e5 + 5;
int s[N];
int d[N];
void add(int x){
    for(int i = 62; i >= 0; i--){
        if(x>>i & 1){
            if(d[i]) x ^= d[i];
            else{
                d[i] = x;
                return;
            }
        }
    }
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    int sum = 0;
    for(int i = 1; i <= n; i++) cin >> s[i],sum ^=s[i]; 
    for(int i = 62; i >= 0; i--){
        if(sum >> i & 1ll) {
            for(int j = 1; j <= n;j++){
                if(s[j] >> i & 1ll){
                    s[j] ^= (1ll << i);
                }
            }
        }
    }
    for(int j = 1; j <= n; j++) add(s[j]);
    int ans = 0;
    for(int i = 62; i >= 0; i--){
        if((ans ^ d[i]) > ans)
            ans = ans ^ d[i];
    }
    cout << (ans ^ sum) + ans << endl;
    return 0;
}

posted @ 2022-07-07 19:30  Sun-Wind  阅读(22)  评论(0编辑  收藏  举报