读假题好难受ㄒoㄒ
L1-1 嫑废话上代码 (5 分)
思路
签到题
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int main(int argc, char** argv) {
cout << "Talk is cheap. Show me the code." << endl;
return 0;
}
L1-2 猫是液体 (5 分)
思路
签到题。
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int main(int argc, char** argv) {
ll a, b, c;
cin >> a >> b >> c;
cout << a * b * c << endl;
return 0;
}
L1-3 洛希极限 (10 分)
思路
真 · 阅读理解,在纸上写一下公式就迎刃而解了。
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int main(int argc, char** argv) {
double a, c; int b;
cin >> a >> b >> c;
double tmp;
if(b) tmp = 1.26 * a;
else tmp = 2.455 * a;
printf("%.2lf ", tmp);
if(tmp > c) printf("T_T\n");
else printf("^_^\n");
return 0;
}
L1-4 调和平均 (10 分)
思路
根据题意模拟即可。
注意数据类型的变化:1.0 / int = double , 1 / int = int
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int main(int argc, char** argv) {
int n;
cin >> n;
double sum = 0, num;
for(int i = 1; i <= n; i++){
cin >> num;
sum += 1.0 / num;
}
double res = 1.0 / (sum / (1.0 * n));
printf("%.2lf\n", res);
return 0;
}
L1-5 胎压监测 (15 分)
思路
依旧是根据题意模拟即可。
用数组处理四个胎压会比较舒服。
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int main(int argc, char** argv) {
int v[5]; int a, b;
for(int i = 1; i <= 4; i++) cin >> v[i];
cin >> a >> b;
int mx = -1;
for(int i = 1; i <= 4; i++) mx = max(mx, v[i]);
int cnt = 0, tot = 0, ind;
for(int i = 1; i <= 4; i++){
if(v[i] < a) tot++, ind = i;
else if(mx - v[i] > b) cnt++, ind = i;
}
if(cnt + tot > 1) cout << "Warning: please check all the tires!" << endl;
else if(cnt + tot == 1) cout << "Warning: please check #" << ind << "!" << endl;
else cout << "Normal" << endl;
return 0;
}
L1-6 吃火锅 (15 分)
思路
字符串匹配,这里暴力匹配不会TI。
用 find 函数时间复杂度会小点。
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int main(int argc, char** argv) {
string s, ss = "chi1 huo3 guo1?";
int cnt = 0, l = ss.size(); // 行数
vector<int> res;
for(int i = 1; 1; i++){
getline(cin, s);
if(s == ".") break;
cnt = i;
int len = s.size();
for(int j = 0, ind = 0; j < len; j++){
if(s[j] == ss[ind]) ind++;
else ind = 0;
if(ind+1 == l){
res.push_back(i);
ind = 0;
break;
}
}
}
cout << cnt << endl;
int flag = res.size();
if(flag){
cout << res[0] << " " << flag << endl;
}
else cout << "-_-#" << endl;
return 0;
}
L1-7 前世档案 (20 分)
思路
二叉树? 二进制处理 !
左 0 右 1,二进制模拟就行~
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int main(int argc, char** argv) {
int n, m;
cin >> n >> m;
for(int i = 1; i <= m; i++){
string s;
cin >> s;
int res = 0;
for(int j = 0; j < n; j++){
if(s[j] == 'y') res = res << 1;
else res = res << 1 | 1;
}
cout << res+1 << endl;
}
return 0;
}
L1-8 刮刮彩票 (20 分)
思路
分别处理题目的各个要求就行。
不想优化代码了,凑合看吧
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int v[4][4] = {0};
int f[4][4] = {0};
int main(int argc, char** argv) {
int num = 45, x = 1, y = 1;
for(int i = 1; i <= 3; i++){
for(int j = 1; j <= 3; j++){
cin >> v[i][j];
num -= v[i][j];
if(v[i][j] == 0) x = i, y = j;
}
}
v[x][y] = num;
int a, b;
for(int i = 1; i <= 3; i++){
cin >> a >> b;
cout << v[a][b] << endl;
}
int F, sum;
cin >> F;
if(F == 1) sum = v[1][1] + v[1][2] + v[1][3];
if(F == 2) sum = v[2][1] + v[2][2] + v[2][3];
if(F == 3) sum = v[3][1] + v[3][2] + v[3][3];
if(F == 4) sum = v[1][1] + v[2][1] + v[3][1];
if(F == 5) sum = v[1][2] + v[2][2] + v[3][2];
if(F == 6) sum = v[1][3] + v[2][3] + v[3][3];
if(F == 7) sum = v[1][1] + v[2][2] + v[3][3];
if(F == 8) sum = v[1][3] + v[2][2] + v[3][1];
if(sum == 6) cout << 10000 << endl;
if(sum == 7) cout << 36 << endl;
if(sum == 8) cout << 720 << endl;
if(sum == 9) cout << 360 << endl;
if(sum == 10) cout << 80 << endl;
if(sum == 11) cout << 252 << endl;
if(sum == 12) cout << 108 << endl;
if(sum == 13) cout << 72 << endl;
if(sum == 14) cout << 54 << endl;
if(sum == 15) cout << 180 << endl;
if(sum == 16) cout << 72 << endl;
if(sum == 17) cout << 180 << endl;
if(sum == 18) cout << 119 << endl;
if(sum == 19) cout << 36 << endl;
if(sum == 20) cout << 306 << endl;
if(sum == 21) cout << 1080 << endl;
if(sum == 22) cout << 144 << endl;
if(sum == 23) cout << 1800 << endl;
if(sum == 24) cout << 3600 << endl;
return 0;
}
L2-1 简单计算器 (25 分)
思路
简单的堆栈模拟。
不会堆栈的看这里:括号匹配
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
stack<int> s1;
stack<char> s2;
int main(int argc, char** argv) {
int n, num;
cin >> n;
for(int i = 1; i <= n; i++){
cin >> num;
s1.push(num);
}
char op;
for(int i = 1; i < n; i++){
cin >> op;
s2.push(op);
}
int f = 1;
while(!s2.empty()){
int a = s1.top(); s1.pop();
int b = s1.top(); s1.pop();
op = s2.top(); s2.pop();
if(op == '+') s1.push(b + a);
if(op == '-') s1.push(b - a);
if(op == '*') s1.push(b * a);
if(op == '/'){
if(a == 0){
cout << "ERROR: " << b << "/" << a << endl;
f = 0;
break;
}
else s1.push(b / a);
}
}
if(f) cout << s1.top() << endl;
return 0;
}
L2-2 口罩发放 (25 分)
思路
细节巨多的模拟。
注意:本题中合法的身份证号码必须是 18 位数字
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
typedef struct Node{
int id; // 序号
string name; // 姓名
string num; // 身份证号
int f; // 健康情况
int h; // 小时
int m; // 分钟
} node;
bool cmp(node A, node B){ // 按时间 和 序号排序
int ta = A.h * 60 + A.m;
int tb = B.h * 60 + B.m;
if(ta == tb) return A.id < B.id;
return ta < tb;
}
node v[1005];
map<string, ll> F; // 统计上次领口罩的天数
vector<node> res;
map<string, ll> FF; // 标记健康情况
bool check(string s){ // 检查身份证号的合法性
int len = s.size();
if(len != 18) return false;
for(int i = 0; i < 18; i++){
if(s[i] > '9') return false;
if(s[i] < '0') return false;
}
return true;
}
int main(int argc, char** argv) {
int d, p;
cin >> d >> p;
for(int j = 1; j <= d; j++){
int n, s; char c;
cin >> n >> s;
for(int i = 1; i <= n; i++){
cin >> v[i].name >> v[i].num >> v[i].f >> v[i].h >> c >> v[i].m;
v[i].id = i;
if(v[i].f == 1 && FF[v[i].num] == 0 && check(v[i].num)){
FF[v[i].num] = 1;
res.push_back(v[i]);
}
}
sort(v+1, v+1+n, cmp);
int sum = 0;
for(int i = 1; i <= n; i++){
string num = v[i].num;
if(F[num] == 0 && sum < s && check(v[i].num)){
cout << v[i].name << " " << v[i].num << endl;
F[num] = j;
sum++;
}
else if(F[num] + p < j && sum < s && check(v[i].num)){
cout << v[i].name << " " << v[i].num << endl;
F[num] = j;
sum++;
}
}
}
int len = res.size();
for(int i = 0; i < len; i++) cout << res[i].name << " " << res[i].num << endl;
return 0;
}
L2-3 完全二叉树的层序遍历 (25 分)
思路
先 DFS 确定各结点下边的孩子结点数,然后建树即可
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int a[105];
int d[105];
int t[105];
int n;
void dfs(int x){
if(x > n) return;
dfs(x<<1);
dfs(x<<1|1);
d[x] = d[x<<1] + d[x<<1|1] + 1;
}
void build(int l, int r, int root){
if(l > r) return;
t[root] = a[r];
build(l, l + d[root<<1] - 1, root<<1);
build(r-d[root<<1|1], r-1, root<<1|1);
}
int main(int argc, char** argv) {
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
dfs(1);
build(1, n, 1);
for(int i = 1; i <= n; i++){
cout << t[i];
if(i == n) cout << endl;
else cout << " ";
}
return 0;
}
L2-4 网红点打卡攻略 (25 分)
思路
按照题意计算即可。
AC代码
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e5 + 5;
int ma[205][205] = {0};
int a[205] = {0};
int f[205];
int main(int argc, char** argv) {
int n, m;
cin >> n >> m;
int u, v, w;
for(int i = 1; i <= m; i++){
cin >> u >> v >> w;
ma[u][v] = ma[v][u] = w;
}
int k, res = 2e9, ind = 0, cnt = 0;
cin >> k;
for(int j = 1; j <= k; j++){
int num;
cin >> num;
for(int i = 1; i <= num; i++) cin >> a[i]; a[num+1] = 0;
if(num != n) continue;
for(int i = 0; i <= num; i++) f[i] = 0;
int flag = 1, sum = 0;
for(int i = 0; i <= num; i++){
if(ma[a[i]][a[i+1]] == 0) flag = 0;
if(f[a[i]] == 0) f[a[i]] = 1;
else flag = 0;
sum += ma[a[i]][a[i+1]];
}
cnt += flag;
if(sum < res && flag){
res = sum;
ind = j;
}
}
cout << cnt << endl;
cout << ind << " " << res << endl;
return 0;
}