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位后,检查是否可以全1
ans1 = i; // 记录右移的最小位移数
ans++;
break; // 只需要找到最少的位移次数,找到即可跳出
}
}
// 枚举左移情况
for(int i = 0 ; i < n ; i ++) {
if((a >> i & b | a).count() == n) { // 左移i位后,检查是否可以全1
ans2 = i; // 记录左移的最小位移数
ans++;
break; // 只需要找到最少的位移次数,找到即可跳出
}
}
// 如果没有任何平移方案,或a本身已是全1串,直接输出0
if(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++复习:继承、多态、多重继承相关