总结:
题目难度基本为0,有基础的不需要担心,去校acm平台熟悉一下题型就行
面试会刷3-4个,但ak了面试绝对不会卡你,自我介绍一下,问问培养计划就好了
由于是考试后写的,评测机关闭了,题解可能有些纰漏,望指正
Problem A: 工大校庆
- 描述
浙江工业大学即将迎来70周年校庆,请你拉条横幅以示庆贺吧!
- 输入
无输入。
- 输出
输出样本示范内容,行末回车。
- 样例
输入:
无
输出:
\\Celebrating the 70th anniversary of Zhejiang University of Technology!//
- 题解
签到题,注意一下转义,提交时记得调语言,默认是C
- 代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
cout << "\\\\Celebrating the 70th anniversary of Zhejiang University of Technology!//" << endl;
}
Problem B: 整理时间
- 描述
老师要求小A写一个程序可以整理获取的时间数据,数据有三个分量构成:时,分,秒。但是小A拿到的时间组合可能是乱的,也可能是错的,小A需要仔细的整理和分辨。现在请你来尝试完成这个工作吧!
- 输入
多组数据,每组数据为一个时间,时用字母H引导,分用字母M引导,秒用字母S引导。输入数据中间不包含空格,如H22M23S55,合法的时间表达应为24小时制。
- 输出
对于给定的每个时间,要按H:M:S的顺序给出规范的时间表达,若检测到时间非法,则给出Error信息。每个结果占一行,行末回车。
- 样例
输入:
M55H32S34
M57S59H2
输出:
Error
2:57:59
- 题解
字符串处理,掺点字符串转整型,一点一点遍历过去就行
24和60也是非法时间,我做的时候忘了,WA了一次
- 代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
int H, M, S, *P;
while (cin >> s)
{
for (int i = 0; i < s.size(); i++)
{
if (s[i] == 'H') P = &H;
else if (s[i] == 'M') P = &M;
else if (s[i] == 'S') P = &S;
for (*P = 0; i < s.size() - 1 && s[i + 1] <= '9' && s[i + 1] >= '0'; i++) *P = 10 * *P + s[i + 1] - '0';
}
if (H >= 24 || M >= 60 || S >= 60 || H < 0 || M < 0 || S < 0) cout << "Error" << endl;
else cout << H << ':' << M << ':' << S << endl;
}
}
Problem C: 13的倍数
- 描述
若将一个整数的个位数字截去,再用余下的数加上原个位数的4倍,如果和是13的倍数,则原数能被13整除。现在我们要用计算机来实现这个判断策略。请你来试一试。
如判断16354能够被13整除:
1635+4*4=1651
165+1*4=169
16+9*4=52
5+2*4=13。
- 输入
输入多个整数。
- 输出
对于每个输入值,输出转换后的结果序列,一直到最后结果是13,26,39之一或者是20以内非13的值为止。每个转换序列一行,行末回车,若结果为13的倍数则输出yes,否则输出no。
整数范围不超过int
- 样例
输入:
16354
1234
13
输出:
1635+4*4=1651
165+1*4=169
16+9*4=52
5+2*4=13
yes
123+4*4=139
13+9*4=49
4+9*4=40
4+0*4=4
no
yes
- 题解
送分题,按题目给的写就行了,主要逻辑三行搞定
- 代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long n;
while (cin >> n)
{
for (int tmp = n / 10 + 4 * (n % 10); n != 13 && n != 26 && n != 39 && n > 20; n = tmp, tmp = n / 10 + 4 * (n % 10))
cout << n / 10 << "+" << n % 10 << "*4=" << tmp << endl;
cout << ((n == 13 || n == 26 || n == 39) ? "yes" : "no") << endl;
}
}
Problem D: 空心菱形
- 描述
一个空心的菱形可以是由两个一正一倒的V字相合而成。现在让我们来画个空心菱形吧。
- 输入
多组输入,每组输入V字的高度n和构成的字符。(5≤n≤30)
- 输出
输出由给定字符围边的菱形。
- 样例
输入:
3 T
5 *
输出:
T
TTT
TT TT
TT TT
TTT
T
*
***
** **
** **
** **
** **
** **
** **
***
*
- 题解
画图题,用格式化输出会方便很多
注意一下每个输出之间有空行,题目里没说,害得我PE了一次
工大acm描述不准确也不是一天两天了
- 代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
string c;
cout << right;
while (cin >> n >> c)
{
cout << setw(n) << c << endl << setw(n + 1) << (c + c + c) << endl;
for (int i = 3; i <= n; i++) cout << setw(n + 2 - i) << (c + c) << setw(2 * (i - 2) + 1) << (c + c) << endl;
for (int i = n; i >= 3; i--) cout << setw(n + 2 - i) << (c + c) << setw(2 * (i - 2) + 1) << (c + c) << endl;
cout << setw(n + 1) << (c + c + c) << endl << setw(n) << c << endl << endl;
}
}
Problem E: 整理高手
- 描述
小张老师是数据整理高手,他喜欢用的数据整理方法描述如下:一次整理由两趟比较构成,先从数据集头部开始两两比较元素,碰到逆序对则交换,这样将最大的元素放到数据集尾部;再从数据集尾部开始两两比较元素,碰到逆序对则交换,这样将最小的元素放到数据集的头部,然后缩小数据集规模。如原始数据集:3,2,5,4,7,1 ;从头开始处理,处理完以后数据集为:2,3,4,5,1,7;再从尾部开始处理,处理完以后数据集为:1,2,3,4,5,7;然后缩小数据规模为2,3,4,5;按照这样的方法整理,那么原始数据集合就慢慢变成升序排列。在整理的过程中,如果一趟比较发现数据已经有序,就结束整理工作。现在请你编程实现小张老师的整理策略。
- 输入
多组输入,每组输入由两行构成。第一行描述待整理的集合规模n(1 <= n < 100);第二行描述待整理的数据集合(由n个数据项构成的行)。所有数据都在int范围以内。
- 输出
每组输出结果为所有整理的经过,输出每次整理后集合内数据排列的情况,每个数据间用逗号分隔,行末直接回车。
- 样例
输入:
6
3 2 5 4 7 1
4
999 888 777 666
输出:
1,2,3,4,5,7
666,888,777,999
666,777,888,999
- 题解
按照题里给的逻辑排序,然后每排序一次输出一次整个数组
下面的代码在输出时用了点技巧,可以让代码短一点
- 代码
#include <bits/stdc++.h>
using namespace std;
int nums[110];
int n;
bool test()
{
for (int i = 1; i < n; i++)
if (nums[i] < nums[i - 1]) return false;
return true;
}
int main()
{
while (cin >> n)
{
for (int i = 0; i < n; i++) cin >> nums[i];
while (!test())
{
for (int i = 1; i < n; i++) if (nums[i] < nums[i - 1]) swap(nums[i], nums[i - 1]);
for (int i = n - 1; i > 0; i--) if (nums[i] < nums[i - 1]) swap(nums[i], nums[i - 1]);
for (int i = 0; i < n; i++) cout << nums[i] << ",\n"[i == n - 1];
}
}
}