说明
年后第一次写题,已经麻了,这次的题很简单但居然只写了两道题。有种本该发挥80分的水平,但是只做出了20分的水平的感觉。不过剩下几个题(除了G题),比完赛一小时内就AC了。欢迎大家交流学习。(最后的G题没做,目前还不打算开始练这种题)
题目列表
A-小苯的石子游戏
思路
模拟双方每次都取最大的,然后比较双方大小输出即可。
参考题解
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 1e2+5;
int a[N];
void solve(){int n;cin >> n;for(int i = 1;i<=n;i++) cin >> a[i];int Alice=0,Bob=0;for(int i = n;i>=1;i--){if((n&1)==(i&1)) Alice+=a[i];else Bob+=a[i];}if(Alice>Bob) cout << "Alice" << endl;else cout << "Bob" << endl;
}
signed main(){//小苯的石子游戏 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T = 1;cin >> T;while(T--){solve();}return 0;
}
B-小苯的排序疑惑
思路
模拟排一下即可。(我这场就是一直卡在这题,我一开始想太复杂了,if讨论没明白,害~)
参考题解
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 2e5+5;
int a[N],b[N],c[N];
int n;
bool check(int *a){for(int i = 1;i<=n-1;i++) if(a[i]>a[i+1]) return false;return true;
}
void solve(){cin >> n;for(int i = 1;i<=n;i++) cin >> a[i];for(int i = 1;i<=n;i++){b[i]=a[i];c[i]=a[i];}if(check(a)) cout << "YES" << endl;else{sort(b+1,b+n);sort(c+2,c+n+1);if(!check(b)&&!check(c)) cout << "NO" << endl;else cout << "YES" << endl;}
}
signed main(){//小苯的排序疑惑 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T = 1;cin >> T;while(T--){solve();}return 0;
}
C-小苯的IDE括号问题(easy)
思路
用双指针模拟即可。
参考题解
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
// const int N = 2e5+5;
string s;
void solve(){int n,k;cin >> n >> k;cin >> s;int pos=s.find('I');int l=pos-1;int r=pos+1;while(k--){string op;cin >> op;if(op=="backspace"){if(l>=0){if(s[l]=='('&&s[r]==')'&&r<n) r++;l--;}}else{if(r<n) r++;}}for(int i = 0;i<=l;i++) cout << s[i];cout << 'I';for(int i = r;i<n;i++) cout << s[i];cout << endl;
}
signed main(){//小苯的IDE括号问题(easy) ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T = 1;
// cin >> T;while(T--){solve();}return 0;
}
D-小苯的IDE括号问题(hard)
思路
用两个数组模拟四种情况,用deque似乎也能实现,不过我还不太会用deque。
参考题解
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 2e5+5;void solve(){int n,k;cin >> n >> k;string s;cin >> s;int pos = s.find('I');vector<char> l;vector<char> r;for(int i = 0;i<pos;i++){l.emplace_back(s[i]);}for(int i = pos+1;i<n;i++){r.emplace_back(s[i]);}reverse(r.begin(),r.end());while(k--){string op;cin >> op;if(op=="backspace"){if(l.size()){if(l.back()=='('&&r.back()==')'&&r.size()) r.pop_back();l.pop_back();}}else if(op=="delete"){if(r.size()) r.pop_back();}else if(op=="->"){if(r.size()){l.emplace_back(r.back());r.pop_back();}}else{if(l.size()){r.emplace_back(l.back());l.pop_back();}}}
// for(int i = 0;i<l.size();i++) cout << l[i];for(char &c:l) cout << c;cout << 'I';if(r.size()){reverse(r.begin(),r.end());for(char &c:r) cout << c;}
// for(int i = r.size()-1;i>=0;i--) cout << r[i];cout << endl;
}
signed main(){//小苯的IDE括号问题(hard) ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T = 1;
// cin >> T;while(T--){solve();}return 0;
}
E-小苯的数组构造
思路
读懂题就很好做,需要考虑前缀最大值,然后模拟一下。
参考题解
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
const int N = 2e5+5;void solve(){int n;cin >> n;vector<int> a(n+1);for(int i = 1;i<=n;i++) cin >> a[i];int maxn = a[1];vector<int> ans(n+1);
// ans[1]=0;for(int i = 2;i<=n;i++){int now=max(0,maxn-a[i]);ans[i]=now;maxn=max(maxn,a[i]);}for(int i = 1;i<=n;i++) cout << ans[i] << " \n"[i==n];
}
signed main(){//小苯的数组构造 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T = 1;
// cin >> T;while(T--){solve();}return 0;
}
G-小苯的逆序对
思路
主要的思路是贪心,我们知道多个数如果做与运算,值肯定变小,根据题意,与的和就求最后一个数即可,前面的异或和或运算用前缀和的思想求一遍,然后最后用一个循环求和的最大值。
参考题解
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
void solve(){int n;cin >> n;
// cout << fixed << setprecision(20);vector<ll> a(n);for(ll& ai:a) cin >> ai;vector<ll> x(n);vector<ll> o(n);for(int i = 0;i<n-1;i++){if(i==0) x[i]=0LL^a[i];else x[i]=x[i-1]^a[i];}for(int i = n-2;i>=0;i--){o[i]=o[i+1]|a[i];}ll ans=0;for(int i = 0;i<n-2;i++){ans=max(ans,x[i]+o[i+1]+a.back());}cout << ans << endl;
}
int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int T = 1;
// cin >> T;while(T--){solve();}return 0;
}