【2022第七届团体程序设计天梯赛】个人题解(C++)

L1-1 今天我要赢

L1-2 种钻石

L1-3 谁能进图书馆

L1-4 拯救外星人

L1-5 试试手气

L1-6 斯德哥尔摩火车上的题

L1-7 机工士姆斯塔迪奥

L1-8 静静的推荐

L2-1 插松枝

L2-2 老板的作息表

L2-3 龙龙送外卖

L2-4 大众情人

L3-1 千手观音

L3-2 关于深度优先搜索和逆序对的题应该不会很难吧这件事

L3-3 教科书般的亵渎

L1-1

解题思路:无脑输出就行了

参考代码

#include <bits/stdc++.h>
using namespace std;

int main() {
	cout << "I'm gonna win! Today!" << endl;
	cout << "2022-04-23";
	return 0;
}

L1-2

解题思路:小学算术

参考代码

#include <bits/stdc++.h>
using namespace std;
int n, v;
int main() {
	cin >> n >> v;
	cout << n / v;
	return 0;
}

L1-3

解题思路:模拟,注意分类讨论

参考代码

#include <bits/stdc++.h>
using namespace std;
int a, b, c1, c2;
char X, Y;
int main() {
	cin >> a >> b >> c1 >> c2;
	if (c1 < a && c2 < a) {
		cout << c1 << "-N" << ' ' << c2 << "-N" << endl;
		cout << "zhang da zai lai ba";
		return 0;
	}
	if (c1 >= a && c2 >= a) {
		cout << c1 << "-Y" << ' ' << c2 << "-Y" << endl;
		cout << "huan ying ru guan";
		return 0;
	}
	int mi = min(c1, c2);
	int ma = max(c1, c2);
	if (mi < a && ma >= a && ma < b) {
		if (c1 < c2) cout << c1 << "-N" << ' ' << c2 << "-Y" << endl;
		else cout << c1 << "-Y" << ' ' << c2 << "-N" << endl;
		if (c1 < c2) X = '2';
		else X = '1';
		cout << X << ": huan ying ru guan";
		return 0;
	}
	if (mi < a && ma >= b) {
		cout << c1 << "-Y" << ' ' << c2 << "-Y" << endl;
		if (c1 < c2) X = '2', Y = '1';
		else X = '1', Y = '2';
		cout << "qing " << X << " zhao gu hao " << Y;
		return 0;
	}
	return 0;
}

L1-4

解题思路:求阶乘

参考代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll ans = 1;
int a, b;
int main() {
	cin >> a >> b;
	for (int i = 1; i <= a + b; i++) ans *= i;
	cout << ans;
	return 0;
}

L1-5

解题思路:记录每个骰子用过的点数,每次循环倒叙求没用过且最大的点数即可

参考代码

#include <bits/stdc++.h>
using namespace std;
int n;
int is[10][10];
int ans[10];
int main() {
	for (int i = 1; i <= 6; i++) {
		cin >> ans[i];
		is[i][ans[i]] = 1;
	}
	cin >> n;
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= 6; i++) {
			for (int j = 6; j >= 1; j--) {
				if (is[i][j] == 0) {
					ans[i] = j;
					is[i][j] = 1;
					break;
				}
			}
		}
	}
	for (int i = 1; i <= 5; i++) cout << ans[i] << ' ';
	cout << ans[6];
	return 0;
}

L1-6

解题思路:直接套题目给个代码

参考代码

#include <bits/stdc++.h>
using namespace std;
string a, b, s1, s2;
int main() {
	cin >> a >> b;
	for (int i = 1; i < a.size(); i++) {
		if (a[i] % 2 == a[i - 1] % 2) {
			s1 += max(a[i], a[i - 1]);
		}
	}
	for (int i = 1; i < b.size(); i++) {
		if (b[i] % 2 == b[i - 1] % 2) {
			s2 += max(b[i], b[i - 1]);
		}
	}
	if (s1 != s2) cout << s1 << endl << s2;
	else cout << s1;
	return 0;
}

L1-7

解题思路:先算行的,每次减去m,再算列的,每次减去(n-行的选择数),剩下的就是安全的格子数

参考代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 5;
int n, m, q;
int cnt;
int is_a[N];
int is_b[N];
ll ans;
int main() {
	cin >> n >> m >> q;
	ans = n * m;
	int t, c;
	for (int i = 1; i <= q; i++) {
		cin >> t >> c;
		if (t == 0) is_a[c] = 1;
		else is_b[c] = 1;
	}
	for (int i = 1; i <= n; i++) {
		if (is_a[i]) {
			cnt++;
			ans -= m;
		}
	}
	for (int i = 1; i <= m; i++) {
		if (is_b[i]) {
			ans -= n - cnt;
		}
	}
	cout << ans;
	return 0;
}

L1-8

解题思路:得分不小于175且PAT通过的一定可以选,得分不小于175但是PAT未通过,可以选,但是只能选k个人,定义cnt表示得分为i的选择数,初始化为k,每次选这样的则减1,如果为0,则不能选这个得分的人

参考代码

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5 + 5;
struct node {
	int s1, s2;
} a[N];
int n, k, s;
int ans;
int cnt[300];
int main() {
	cin >> n >> k >> s;
	for (int i = 1; i <= 290; i++) cnt[i] = k;
	for (int i = 1; i <= n; i++) cin >> a[i].s1 >> a[i].s2;
	for (int i = 1; i <= n; i++) {
		if (a[i].s1 >= 175 && a[i].s2 < s && cnt[a[i].s1]) {
			cnt[a[i].s1]--;
			ans++;
			continue;
		}
		if (a[i].s1 >= 175 && a[i].s2 >= s) ans++;
	}
	cout << ans;
	return 0;
}

L2-1

解题思路:模拟

参考代码

#include<bits/stdc++.h>
using namespace std;
int n, m, k;
queue<int> q;
vector<vector<int>> ans;
vector<int> st;
stack<int> sh;
int d;
int main() {
	cin >> n >> m >> k;
	for (int i = 0; i < n; i++) {
		int x;
		cin >> x;
		q.push(x);
	}
	while (sh.size() || q.size()) {
		if (st.size() != 0) d = st.back();
		else d = 1e9;
		if (sh.size() && sh.top() <= d) {
			st.push_back(sh.top());
			sh.pop();
			if ((int)st.size() == k) {
				ans.push_back(st);
				st.clear();
			}
		} else if (q.size() && q.front() <= d) {
			st.push_back(q.front());
			q.pop();
			if ((int)st.size() == k) {
				ans.push_back(st);
				st.clear();
			}
		} else if (q.size() && (int)sh.size() < m) {
			sh.push(q.front());
			q.pop();
		} else {
			ans.push_back(st);
			st.clear();
		}
	}

	if (st.size()) {
		ans.push_back(st);
		st.clear();
	}
	for (auto &p : ans) {
		cout << p[0];
		for (int i = 1; i < p.size(); i++)
			cout << " " << p[i];
		cout << endl;
	}
	return 0;
}

L2-2

解题思路:模拟即可

参考代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e3 + 5;
int n;
vector<pair<string, string>> v;
string a, b, c;
int main() {
	cin >> n;
	while (n--) {
		cin >> a >> c >> b;
		v.push_back({a, b});
	}
	v.push_back({"", "00:00:00"});
	v.push_back({"23:59:59", ""});
	sort(v.begin(), v.end());
	for (int i = 0; i < v.size() - 1; i++) {
		if (v[i].second != v[i + 1].first)
			cout << v[i].second << " - " << v[i + 1].first << endl;
	}
	return 0;
}

L2-3(不知道哪里错了,21分)

解题思路:弗洛伊德

参考代码:

#include<bits/stdc++.h>
using namespace std;
const int N = 5e2 + 5;
int inf = 0x3f3f;
int n, k;
char f[N];
int  dis[N][N];
string s;
void Floyd() {
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
			}
		}
	}
}
struct node {
	int id, max;
};
bool cmp(node a, node b) {
	return a.max < b.max;
}
int main() {
	memset(dis, inf, sizeof(dis));
	cin >> n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			if (i == j) dis[i][j] = 0;
	for (int i = 1; i <= n; i++) {
		cin >> f[i] >> k;
		while (k--) {
			int v, w;
			scanf("%d:%d", &v, &w);
			dis[i][v] = w;
		}
	}
	Floyd();
	vector<node>ans;
	for (int i = 1; i <= n; i++) {
		int ma = 0;
		if (f[i] == 'F') {
			for (int j = 1; j <= n; j++) {
				if (f[j] == 'M' && dis[j][i] != inf) {
					ma = max(ma, dis[j][i]);
				}
			}
			if (ma != 0)	ans.push_back({i, ma});
		}
	}
	vector<int>v;
	sort(ans.begin(), ans.end(), cmp);
	for (int i = 0; i < ans.size(); i++) {
		if (ans[i].max == ans[0].max) {
			v.push_back(ans[i].id);
		}
	}
	for (int i = 0; i < v.size() - 1; i++) {
		cout << v[i] << ' ';
	}
	if (!v.empty())	cout << v.back();

	cout << endl;
	ans.clear();
	v.clear();

	for (int i = 1; i <= n; i++) {
		int ma = 0;
		if (f[i] == 'M') {
			for (int j = 1; j <= n; j++) {
				if (f[j] == 'F' && dis[j][i] != inf) {
					ma = max(ma, dis[j][i]);
				}
			}
			if (ma != 0)	ans.push_back({i, ma});
		}
	}
	sort(ans.begin(), ans.end(), cmp);
	for (int i = 0; i < ans.size(); i++) {
		if (ans[i].max == ans[0].max) {
			v.push_back(ans[i].id);
		}
	}
	for (int i = 0; i < v.size() - 1; i++) {
		cout << v[i] << ' ';
	}
	if (!v.empty())	cout << v.back();
	return 0;
}

L2-4

L3-1

L3-2

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值