2020年团体程序设计天梯赛-总决赛 (L1 - L2)

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;
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值