随便写写
A
此题较为简单,主要考察基本语法
#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
一道模拟题,主要需要把题意读懂
#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
主要考察思维
#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
利用优先队列实现的贪心
#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
题目中是求异或和,很容易能想到线性基,关键在于如何去运用
第一个比较难想的点是,我们需要先求出来所有数的异或和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;
}