目录
题目可以在PTA团体程序设计天梯赛-练习集 练习提交
L1-1 编程解决一切
AC代码(Python3):
print("Problem? The Solution: Programming.")
L1-2 再进去几个人
AC代码(Python3):
n,m = input().split()
print(int(m)-int(n))
L1-3 帮助色盲
题意:红绿色盲患者分辨不出红绿灯,但是可以看别人的行动决定走不走。题目输入A和B,A是交通灯的颜色,根据灯的颜色判断能不能走。B是前面有没有人,没有人而且不是黄灯就需要根据要求输出提示音。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int a,b;
int main() {
cin >> a >> b;
if(a == 0 && b == 0) cout << "biii\n";
else if(a == 1 && b == 0) cout << "dudu\n";
else cout << "-\n";
if(a == 1) cout << "move";
else cout << "stop";
}
L1-4 四项全能
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n, m, x, sum;
int main() {
cin >> n >> m;
for(int i=0;i<m;i++) {
cin >> x;
sum += x;
}
cout << max(0, sum-n*(m-1));
}
L1-5 别再来这么多猫娘了!
省略前面无关内容
题意:给出一行不超过5000字符的字符串,统计其中的违禁词数量。如果个数少于阈值,则将违禁词替换为<censored>,否则输出违禁词的数量,然后输出一行警告。
违禁词替换后从这个词的下一个字符继续,比如违禁词为AA,文本为AAA,则替换后为<censored>A。要注意违禁词就是<censored>的情况,先把违禁词替换为=,输出的时候再判断输出。
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n, k, res;
vector<string> v;
string s;
int main() {
cin >> n;
for(int i=0;i<n;i++) {
string s1;
cin >> s1;
v.push_back(s1);
}
cin >> k;
cin.get();
getline(cin,s);
// 遍历v中的所有词,替换为=
for(int i=0;i<v.size();i++){
while(s.find(v[i]) != string::npos){
s.replace(s.find(v[i]),v[i].size(),"=");
res++;
}
}
if(res < k) {
for(int i=0;i<s.size();i++) {
if(s[i] == '=') cout << "<censored>";
else cout << s[i];
}
} else {
cout << res << endl;
cout << "He Xie Ni Quan Jia!";
}
}
L1-6 兰州牛肉面
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n, x, y;
int a[105];
double p[105], sum;
int main() {
cin >> n;
for(int i=1;i<=n;i++) cin>>p[i];
while(cin>>x>>y, x) {
a[x] += y;
sum += y*p[x];
}
for(int i=1;i<=n;i++) {
cout << a[i] <<endl;
}
printf("%.2f",sum);
}
L1-7 整数的持续性
AC代码∶
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int a, b, maxn;
map<int,vector<int>> mp;
int f(int x) {
int cnt = 0, tmp = 1;
while(x >= 10) {
cnt++;
// 计算x每一位的乘积
tmp = 1;
while(x) {
tmp*=(x%10);
x/=10;
}
x = tmp;
}
return cnt;
}
int main() {
cin >> a >> b;
for(int i=a;i<=b;i++) {
int cnt = f(i);
mp[cnt].push_back(i);
maxn = max(maxn, cnt);
}
cout << maxn << endl;
for(int i=0;i<mp[maxn].size();i++) {
if(i != 0) cout << " ";
cout << mp[maxn][i];
}
}
L1-8 九宫格
AC代码∶
#include<bits/stdc++.h>
using namespace std;
int n;
void check() {
int r[10][10], col[10][10], rect[10][10];
int g[10][10];
memset(r,0,sizeof r);
memset(col,0,sizeof col);
memset(rect,0,sizeof rect);
memset(g,0,sizeof g);
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
cin >> g[i][j];
}
}
bool flag = 1;
for(int i=0;i<9;i++) {
for(int j=0;j<9;j++) {
int x = g[i][j];
if(x < 1 || x > 9) flag = 0;
if(r[i][x]) flag = 0;
if(col[j][x]) flag = 0;
if(rect[i/3*3+j/3][x]) flag = 0;
r[i][x] = col[j][x] = rect[i/3*3+j/3][x] = 1;
}
}
cout << flag << endl;
}
int main(){
cin >> n;
for(int i=0;i<n;i++) {
check();
}
}
L2-1 鱼与熊掌
AC代码∶
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n, m, k, q;
vector<int> v[N];
int main() {
cin >> n >> m;
for(int i=1;i<=n;i++) {
cin >> k;
while(k--) {
int x;
cin >> x;
v[x].push_back(i);
}
}
cin >> q;
while(q--) {
int x, y, cnt = 0;
cin >> x >> y;
unordered_map<int,int> mp;
// 记录x中的所有人的编号
for(auto i:v[x])
mp[i] = 1;
// 记录同时存在x和y中的人数
for(auto i:v[y]) {
if(mp[i]) cnt++;
}
cout << cnt << endl;
}
}
L2-2 懂蛇语
AC代码∶
#include <bits/stdc++.h>
using namespace std;
int n, m;
unordered_map<string,vector<string>> mp;
string s;
int main() {
cin >> n;
cin.get();
for(int i=0;i<n;i++) {
getline(cin,s);
stringstream ss;
ss << s;
string tmp = "", tmp2 = "";
// ss相当于cin,遇到空格结束,取出s中的所有单词
while(ss >> tmp) {
tmp2 += tmp[0]; // 取出首字母
}
mp[tmp2].push_back(s);
}
cin >> m;
cin.get();
for(int i=0;i<m;i++) {
// 操作同上
getline(cin,s);
stringstream ss;
ss << s;
string tmp = "", tmp2 = "";
while(ss >> tmp) {
tmp2 += tmp[0];
}
if(mp[tmp2].size() == 1) {
cout << mp[tmp2][0] << endl;
}
else if(mp[tmp2].size() == 0) {
cout << s << endl;
}
else {
sort(mp[tmp2].begin(), mp[tmp2].end());
for(int j=0;j<mp[tmp2].size();j++) {
if(j != 0) cout << "|";
cout << mp[tmp2][j];
}
cout << endl;
}
}
}
L2-3 满树的遍历
AC代码∶
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int n, m, x, k, root;
vector<int> tr[N];
void dfs(int node) {
for(auto i:tr[node]) {
cout << " " << i;
dfs(i);
}
}
int main(){
cin >> n;
for(int i=1;i<=n;i++) {
cin >> x;
if(x) tr[x].push_back(i);
else root = i;
if(tr[x].size() > k) k = tr[x].size();
}
cout << k << " ";
bool flag = 1;
for(int i=1;i<=n;i++) {
// 这里要排序,题目要求兄弟节点按编号升序访问
sort(tr[i].begin(), tr[i].end());
if(tr[i].size() != 0 && tr[i].size() != k) {
flag = 0;
}
}
if(flag) cout << "yes\n";
else cout << "no\n";
cout << root;
dfs(root);
}
L2-4 吉利矩阵
没想出来怎么写,写了十几个for循环打表。
AC代码∶
#include<bits/stdc++.h>
using namespace std;
int n, l;
int res[5][10] = {
{},
{},
{0,0,3,4,5,6,7,8,9,10},
{0,0,21,55,120,231,406,666,1035,1540},
{0,0,282,2008,10147,40176,132724,381424,981541,2309384}
};
int main(){
cin >> l >> n;
cout << res[n][l];
}
L3-1 夺宝大赛
题意:有k个队伍从各自的起点出发,各自选择各自到大本营最近的路径前往大本营,同时到达大本营的多个队伍会发生火拼,最早到达大本营而且没有发生火拼的队伍获胜。这里我们从大本营向外按层bfs,同一层内(到大本营的距离相同)只有一支队伍时这个队伍获胜,如果搜索完都没有这样的队伍,输出No winnner.
按层bfs可以看这个:二叉树的层序遍历 - 力扣(LeetCode),与一般的bfs不同,这个每次取出队列离起点同样距离的所有元素,就可以直接统计相同距离的队伍有多少个。
AC代码∶
#include <bits/stdc++.h>
using namespace std;
const int N = 1e2+5;
int n, m, k, x, y;
int sx, sy;
int g[N][N];
struct node {
int x,y;
int cnt;
};
int dx[]={0,0,-1,1}, dy[]={-1,1,0,0};
void bfs() {
queue<node> q;
q.push({sx,sy,0});
g[sx][sy] = 0;
while(!q.empty()) {
// 每次取出所有点,这样队列中的点的cnt就都是相同的
// 同一层只有一个队伍时结束
int t = q.size();
int cntt = 0;
int res, resc;
while(t--) {
node tmp = q.front();
q.pop();
for(int i=0;i<4;i++) {
int xx = tmp.x + dx[i];
int yy = tmp.y + dy[i];
if(xx<1||xx>m||yy<1||yy>n||g[xx][yy]==0)
continue;
if(g[xx][yy]>1) {
// 大于1说明是队伍,统计同一层内的队伍
cntt++;
res = g[xx][yy], resc = tmp.cnt+1;
}
g[xx][yy] = 0;
q.push({xx,yy,tmp.cnt+1});
}
}
if(cntt == 1) {
cout << res-10 << " " << resc;
return ;
}
}
cout << "No winner.";
}
int main() {
cin >> m >> n;
for(int i=1;i<=m;i++) {
for(int j=1;j<=n;j++) {
cin >> g[i][j];
if(g[i][j] == 2) sx = i,sy = j;
}
}
cin >> k;
for(int i=1;i<=k;i++) {
cin >> y >> x; // 注意这里输入是列在前面
g[x][y] = 10 + i; // 将起点和其他区别开
}
bfs();
}