前言
刚做完= =第五题写炸了
先大概讲讲我的思路,有机会我会写个完整的题解(估计不可能啦,忙的要死)
这些代码都是我比赛时候写的,不保证正确性
第一题
水题,记录最后一次的得分即可
#include <cstdio>
using namespace std;
int main() {
int ans = 0, base = 1, x;
while (true) {
scanf("%d", &x);
if (x == 0) {
printf("%d\n", ans);
break;
}
else if (x == 1) base = 1;
else if (base == 1) base = 2;
else base += 2;
ans += base;
}
return 0;
}
第二题
考虑到两个球相碰只会变方向,所以模拟球的运行即可
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int a[105], d[105], vis[1005];
int main() {
int n, L, t;
scanf("%d%d%d", &n, &L, &t);
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
d[i] = 1;
}
for (int i = 1; i <= t; i++) {
memset(vis, -1, sizeof(vis));
for (int j = 0; j < n; j++) {
a[j] += d[j];
if (vis[a[j]] != -1) swap(d[j], d[vis[a[j]]]);
else vis[a[j]] = j;
if (a[j] == 0) d[j] = 1;
if (a[j] == L) d[j] = -1;
}
}
for (int i = 0; i < n; i++) {
printf("%d%c", a[i], i == n - 1 ? '\n' : ' ');
}
return 0;
}
第三题
按照题意理解,会发现只需要考虑三种匹配的情况即可。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string S, R, rule[105], name[105], str;
vector<string> ans;
int L[105];
int main() {
int n, m, len, rule_pos, str_pos;
bool error, flag;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> rule[i] >> name[i];
L[i] = rule[i].length();
}
for (int i = 0; i < m; i++) {
flag = false;
cin >> str;
len = str.length();
for (int j = 0; j < n; j++) {
//cout << "Here is rule NO." << j << endl;
ans.clear();
rule_pos = 0, str_pos = 0, error = false;
while (str_pos < len && rule_pos < L[j]) {
//cout << "At str_pos = " << str_pos << " , rule_pos = " << rule_pos << endl;
if (rule[j][rule_pos] == '<') {
rule_pos++;
R.clear();
while (rule[j][rule_pos] != '>') {
R += rule[j][rule_pos];
rule_pos++;
}
rule_pos++;
if (R == "int") {
S.clear();
while (true) {
if (str_pos == len) {
if (S.length() == 0) {
error = true;
}
break;
}
if (str[str_pos] == '/') {
if