2025寒假天梯赛训练1
7-1 心理阴影面积
思路
用一半的面积减去一个梯形和一个三角形面积即可。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int a, b;cin >> a >> b;cout << (5000 - (100 - a) * 50 - b * 50) << "\n";return 0;
}
7-2 人与神
思路
直接输出即可。
代码
To iterate is human, to recurse divine.
7-3 通讯录的录入与显示
思路
按题意输出即可。
注意记录编号可能为负数。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<array<string,5>> s(n);for(auto &x : s){for(int i = 0;i < 5;i ++){cin >> x[i];}} int k;cin >> k;while(k--){int x;cin >> x;if(x >= n || x < 0){cout << "Not Found\n";}else{cout << s[x][0] << " " << s[x][3] << " " << s[x][4] << " " << s[x][2] << " " << s[x][1] << "\n";}}return 0;
}
7-4 算术入门之加减乘除
思路
按题意要求输出即可。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int a,b;cin >> a >> b;cout << a << " + " << b << " = " << a + b << "\n" ;cout << a << " - " << b << " = " << a - b << "\n" ;cout << a << " * " << b << " = " << a * b << "\n" ;if(a % b == 0){cout << a << " / " << b << " = " << a / b << "\n" ;}else{cout << fixed << setprecision(2) << a << " / " << b << " = " << a * 1.0 / b << "\n" ;}return 0;
}
7-5 出生年
思路
按题意模拟。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int a,b;cin >> a >> b;int cs = a;while(1){set<int> has;if(a < 1000){has.insert(0);}int t = a;while(t){has.insert(t%10);t/=10;}if(has.size() == b){printf("%d %04d\n",a-cs,a);break;}a ++;}return 0;
}
7-6 九宫格输入法
思路
按题意模拟。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);vector<string> s{"0 ","1,.?!","2ABC","3DEF","4GHI","5JKL","6MNO","7PQRS","8TUV","9WXYZ"};string x;while (cin >> x) {int a = x[0] - '0';int b = x.size();b--;b %= (int)s[a].size();cout << s[a][b];}return 0;
}
7-7 螺旋方阵
思路
按题意模拟。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector a(n + 1, vector(n + 1, 0));int has = 0, x = 1, y = 0;while (has < n * n) {while(y + 1 <= n && !a[x][y + 1]){y ++;a[x][y] = ++has;}while(x + 1 <= n && !a[x + 1][y]){x ++;a[x][y] = ++has;}while(y - 1 >= 1 && !a[x][y - 1]){y --;a[x][y] = ++has;}while(x - 1 >= 1 && !a[x-1][y]){x --;a[x][y] = ++has;}}for(int i = 1;i <= n;i ++){for(int j = 1;j <= n;j ++){cout << setw(3) << a[i][j];}cout << "\n";}return 0;
}
7-8 抓老鼠啊~亏了还是赚了?
思路
有点需要注意细节的模拟。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string s;cin >> s;int happy = 0, nohappy = 0, sad = 0;int nai = 0, now = 0;string ans = "";auto clear = [&]() {happy--;happy = max(happy, 0);nohappy--;nohappy = max(nohappy, 0);sad--;sad = max(sad, 0);};for (int i = 0; i < s.size() - 1; i ++) {if (s[i] == 'X') {if (happy || (!nohappy && !sad)) {ans += "U";nohappy = 2;} else {ans += "-";}} else if (s[i] == 'T') {if (happy || (!nohappy && !sad)) {ans += "D";now += 7;sad = 3;} else {ans += "-";}} else {if (happy || (!nohappy && !sad)) {ans += "!";now -= 3;happy = 3;} else {ans += "-";}}clear();}cout << ans << "\n" << now << "\n" ;return 0;
}
7-9 Windows消息队列
思路
用优先队列维护优先级即可。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;priority_queue<pair<int, string>,vector<pair<int, string>>,greater<pair<int, string>>> Q;while (n--) {string x;cin >> x;if (x == "GET") {if (Q.empty()) {cout << "EMPTY QUEUE!\n";} else {auto [_, s] = Q.top();Q.pop();cout << s << "\n";}} else {int m;cin >> x >> m;Q.emplace(m, x);}}return 0;
}
7-10 名人堂与代金券
思路
考察排序。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n,g,k;cin >> n >> g >> k;vector<pair<string,int>> a(n);int need = 0;for(auto &[x,y] : a){cin >> x >> y;if(y >= g){need += 50;}else if(y >= 60){need += 20;}} cout << need << "\n";sort(a.begin(),a.end(),[](auto x,auto y){if(x.second != y.second) return x.second > y.second;return x.first < y.first;});int rank = 1;for(int i = 0;i < n;i ++){if(rank > k) break;cout << rank << " " << a[i].first << " " << a[i].second << "\n";while(i + 1 < n && a[i + 1].second == a[i].second){i ++;cout << rank << " " << a[i].first << " " << a[i].second << "\n";}rank = i + 2;}return 0;
}
7-11 用扑克牌计算24点
思路
答辩题。
实际要注意的细节比较多,括号的顺序可以直接列出来然后挨个判断,其余的就是暴力搜索了。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);string a[4];for (int i = 0; i < 4; i ++) {cin >> a[i];}auto check = [&](string & s)->bool{int i = 0;auto calc = [](double x, double y, char op)->double{if (op == '+') return x + y;if (op == '-') return x - y;if (op == '*') return x * y;return x * 1.0 / y;};auto Calc = [&](auto && self)->double{char op = '+';stack<double> st;for (; i < s.size(); i++) {if (s[i] == '(') {i ++;st.push(self(self));} else if (s[i] != ')') {if (isdigit(s[i])) {int x = s[i] - '0';if (isdigit(s[i + 1])) {x = x * 10 + s[i + 1] - '0';i ++;}st.push(x);} else {op = s[i];}} else {double y = st.top();st.pop();double x = st.top();st.pop();return calc(x, y, op);}}if (st.size() > 1) {double y = st.top();st.pop();double x = st.top();st.pop();st.push(calc(x, y, op));}return st.top();};bool ok = Calc(Calc) == 24;return ok;};string p = "+-*/";string s = "((2-(3+12))+12)";sort(a, a + 4);do {for (auto x : p) {for (auto y : p) {for (auto z : p) {s = "((" + a[0] + x + a[1] + ")" + y + a[2] + ")" + z + a[3];if (check(s)) {cout << s << "\n";return 0;}s = "(" + a[0] + x + a[1] + ")" + y + "(" + a[2] + z + a[3] + ")";if (check(s)) {cout << s << "\n";return 0;}s = a[0] + x + "(" + a[1] + y + "(" + a[2] + z + a[3] + "))" ;if (check(s)) {cout << s << "\n";return 0;}s = a[0] + x + "((" + a[1] + y + a[2] + ")" + z + a[3] + ")";if (check(s)) {cout << s << "\n";return 0;}s = "(" + a[0] + x + "(" + a[1] + y + a[2] + "))" + z + a[3];if (check(s)) {cout << s << "\n";return 0;}}}}} while (next_permutation(a, a + 4));cout << "-1\n";return 0;
}
7-12 玩转二叉树
思路
先用中序前序按层还原二叉树,然后对于每一层反向输出即可。
代码
#include <bits/stdc++.h>using namespace std;using i64 = long long;int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;vector<int> pre(n), mid(n);for (int i = 0; i < n; i ++) {cin >> mid[i];}for (int i = 0; i < n; i ++) {cin >> pre[i];}map<int, vector<int>> tr;int len = 0;auto dfs = [&](auto && self, int rt, int st, int ed, int len)->void{if (st > ed) {return;}int root = st;while (root < ed && pre[rt] != mid[root]) {root ++;}self(self, rt + 1, st, root - 1, len + 1);self(self, rt + root - st + 1, root + 1, ed, len + 1);tr[len].emplace_back(pre[rt]);};dfs(dfs, 0, 0, n - 1, 0);vector<int> ans;for (int i = 0; i < n; i ++) {if (tr[i].size()) {for (int j = tr[i].size() - 1; j >= 0; j --) {ans.push_back(tr[i][j]);}}}for (int i = 0; i < n; i ++) {cout << ans[i] << " \n"[i == n - 1];}return 0;
}