1 一道必须手模双向链表才能过的题,还必须是C++
#include <iostream>using namespace std;const int N = 100010;
int l, r;
int n;// 每个节点的左节点和右节点
int L[N], R[N];
// 节点是否已经被使用
int ud[N];
// 剩余节点数量,当前起始节点,当前末尾节点
int remain, beg, ed;int main()
{cin >> l >> r;// 建立“链表”关系for(int i=l; i<=r; i++) {L[i] = i-1;R[i] = i+1;}cin >> n;beg = l, ed = r;remain = r-l+1;for(int i=0; i<n; i++) {int op, v;cin >> op >> v;if(op == 1) {// 不够分配if(remain < v) continue;while(v--) {// “孤立”当前节点R[L[beg]] = R[beg];L[R[beg]] = L[beg];ud[beg] = 1;remain--;// 更新起始节点beg = R[beg];}} else if(op == 2) {if(v < l || v > r || ud[v]) continue;// “孤立”当前节点R[L[v]] = R[v];L[R[v]] = L[v];// 如果指定分配的节点是首尾节点,要特殊处理一下if(v == beg) beg = R[v];else if(v == ed) ed = L[v];ud[v] = 1;remain--;} else {if(v < l || v > r || !ud[v]) continue;if(remain == 0) {// 当前资源全部用完,特殊处理beg = ed = v;} else {// 把当前节点放到最后,建立前后关系R[ed] = v;L[v] = ed;ed = v;}ud[v] = 0;remain++;}}cout << beg << endl;
}
2 一道按位操作的题,可以说是bitset实践了
#include <bits/stdc++.h>
using namespace std;bitset<1024> a, b;
int n;
string s;void print(bitset<1024> x) {for(int i = 0 ; i < n ; i ++) {cout << x[i]; }cout << endl;
}int main() {cin >> n; int idx = 0; while(cin >> s) {int now = 0; for(int i = 2 ; i < s.size() ; i ++) { if(s[i] >= '0' && s[i] <= '9') { now = now * 16 + s[i] - '0'; } else { now = now * 16 + s[i] - 'A' + 10; }}stack<int> st;for(int i = 0 ; i < 16 ; i ++) { st.push(now & 1); now >>= 1; }for(int i = 0 ; i < 16 && idx < n ; i ++, idx++) {a[idx] = st.top(); st.pop();}}for(int i = 0 ; i < n ; i ++) {b[i] = 1; }int ans = 0; int ans1 = -1, ans2 = -1; // 枚举右移情况for(int i = 0 ; i < n ; i ++) {if((a << i & b | a).count() == n) { // 右移i位后,检查是否可以全1ans1 = i; // 记录右移的最小位移数ans++;break; // 只需要找到最少的位移次数,找到即可跳出}}// 枚举左移情况for(int i = 0 ; i < n ; i ++) {if((a >> i & b | a).count() == n) { // 左移i位后,检查是否可以全1ans2 = i; // 记录左移的最小位移数ans++;break; // 只需要找到最少的位移次数,找到即可跳出}}// 如果没有任何平移方案,或a本身已是全1串,直接输出0if(ans == 0 || a.count() == n) {cout << 0 << endl;return 0;}// 输出可以使其全1的平移方案数cout << (ans1 != -1) + (ans2 != -1) << endl;// 输出右移方案if(ans1 != -1) {cout << "+" << ans1 << endl;print((a ^ b) >> ans1); }// 输出左移方案if(ans2 != -1) {cout << "-" << ans2 << endl;print((a ^ b) << ans2); }
}
3 C++复习:继承、多态、多重继承相关