文章目录
L1-1 新世界 (5分)
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
puts("Hello World");
puts("Hello New World");
return 0;
}
L1-2 打折 (5分)
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
double x, y;
cin >> x >> y;
printf("%.2f\n", x * y / 10);
return 0;
}
L1-3 奇偶分家 (10分)
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int n, t, a, b;
cin >> n;
a = b = 0;
while (n--) {
cin >> t;
if (t % 2 == 1)
a++;
else
b++;
}
cout << a << " " << b << endl;
return 0;
}
L1-4 冠军魔术 (10分)
#include <bits/stdc++.h>
using namespace std;
int main(void)
{
int a, b;
cin >> a >> b;
int flag = 0, res = a;
for (int i = 1; i <= b; i++) {
flag = !flag;
if (i % 2 == 0)
res *= 2;
}
cout << flag << " " << res << endl;
return 0;
}
L1-5 判断题 (15分)
#include <bits/stdc++.h>
using namespace std;
int sco[105], acc[105];
int main(void)
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= m; i++) {
cin >> sco[i];
}
for (int i = 1; i <= m; i++) {
cin >> acc[i];
}
int t, res;
while (n--) {
res = 0;
for (int i = 1; i <= m; i++) {
cin >> t;
if (t == acc[i]) {
res += sco[i];
}
}
cout << res << endl;
}
return 0;
}
L1-6 检查密码 (15分)
密码可能会有空字符,所以需要读入一行
#include <bits/stdc++.h>
using namespace std;
int sco[105], acc[105];
string s;
int main(void)
{
int n;
bool f1, f2, f3;
cin >> n;
getchar();
while (n--) {
getline(cin, s);
f1 = 1, f2 = f3 = 0;
int len = s.size();
for (int i = 0; i < len; i++) {
if (isdigit(s[i])) {
f3 = 1;
} else if (isalpha(s[i])) {
f2 = 1;
} else if (s[i] == '.') {
continue;
} else {
f1 = 0;
}
}
if (len >= 6 && f1 && f2 && f3)
puts("Your password is wan mei.");
else if (len < 6)
puts("Your password is tai duan le.");
else if (f1 == 0)
puts("Your password is tai luan le.");
else if (f3 == 0)
puts("Your password needs shu zi.");
else
puts("Your password needs zi mu.");
}
return 0;
}
L1-7 谷歌的招聘 (20分)
注意有前缀0时,要输出前缀0
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[1005], num[15];
bool judge(ll x)
{
if (x < 2)
return 0;
for (ll i = 2; i * i <= x; i++) {
if (x % i == 0)
return 0;
}
return 1;
}
int main(void)
{
int n, k;
cin >> n >> k;
cin >> s;
bool flag = 0;
for (int i = 0; i < n - k + 1; i++) {
memset(num, 0, sizeof num);
for (int j = 0; j < k; j++) {
num[j] = s[i + j];
}
ll numb = 0;
for (int j = 0; j < k; j++) {
numb *= 10;
numb += s[i + j] - '0';
}
if (judge(numb)) {
cout << num << endl;
flag = 1;
return 0;
}
}
if (flag == 0)
cout << "404" << endl;
return 0;
}
L1-8 阅览室 (20分)
答案需要四舍五入输出
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool st[1005];
int ti[1005];
int main(void)
{
int n;
int id, h, m;
int cnt = 0;
double res = 0;
string op, time;
cin >> n;
while (n > 0) {
cin >> id >> op >> time;
h = (time[0] - '0') * 10 + (time[1] - '0');
m = (time[3] - '0') * 10 + (time[4] - '0');
m += h * 60;
if (op[0] == 'S') {
st[id] = 1;
ti[id] = m;
}
if (op[0] == 'E' && st[id] == 1) {
res += m - ti[id];
//cout << res << endl;
st[id] = 0;
cnt++;
}
if (id == 0) {
memset(st, 0, sizeof st);
if (cnt > 0)
res /= cnt;
cout << cnt << " " << (int)(res + 0.5) << endl;
n--;
res = cnt = 0;
}
}
return 0;
}
L2-1 出栈序列的合法性 (25分)
给出入栈顺序,判断出栈顺序是否合法?
大体思路就是用栈来模拟一下,是否能够以这种顺序输出。
每次按顺序放入元素,如果栈顶元素等于出栈顺序的元素,就出栈,否则继续放入元素
如果最后栈为空,说明出栈顺序合法
#include <bits/stdc++.h>
using namespace std;
stack<int> stk;
int a[1005];
int main(void)
{
int m, n, k;
int idx;
cin >> m >> n >> k;
while (k--) {
// 清空栈
while (stk.size()) {
stk.pop();
}
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
idx = 1;
// 模拟是否可以按照给定序列出栈
for (int i = 1; i <= n; i++) {
stk.push(i);
// 栈满了
if (stk.size() > m) {
break;
}
while (stk.size() && stk.top() == a[idx]) {
stk.pop();
idx++;
}
}
cout << (stk.size() == 0 ? "YES" : "NO") << endl;
}
return 0;
}
L2-2 抢红包 (25分)
单纯的模拟,结构体排序
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
struct node {
int id, cnt;
double sum;
} a[N];
bool cmp(node a, node b)
{
if (a.sum != b.sum)
return a.sum > b.sum;
else if (a.cnt != b.cnt)
return a.cnt > b.cnt;
else
return a.id < b.id;
}
int main(void)
{
int n, k;
cin >> n;
int nk;
double pk;
for (int i = 1; i <= n; i++) {
a[i].id = i;
scanf("%d", &k);
for (int j = 0; j < k; j++) {
scanf("%d%lf", &nk, &pk);
a[i].sum -= pk;
a[nk].sum += pk;
a[nk].cnt++;
}
}
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) {
printf("%d %.2f\n", a[i].id, a[i].sum / 100);
}
return 0;
}
L2-3 二叉搜索树的2层结点统计 (25分)
用一维数组来存储能拿到23分。因为有1000个节点,考虑最复杂的情况,最多会有1000层,而用一维数组来存储的话需要 2 1000 2^{1000} 21000 个节点
可以想到使用结构体:用val 表示节点值,lson 表示左儿子的索引值,rson 表示右儿子的索引值
struct node {
int val = -INF;
int lson = -1, rson = -1;
} t[N];
25分代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4 + 5, INF = 0x3f3f3f3f;
struct node {
int val = -INF;
int lson = -1, rson = -1;
} t[N];
int idx = 1;
// maxv表示最深的层数
int maxv = -1, res;
// 递归给树赋值
void dfs1(int x, int val, int dept)
{
if (t[x].val == -INF) {
maxv = max(maxv, dept);
t[x].val = val;
return;
} else if (val <= t[x].val) {
if (t[x].lson == -1) {
t[x].lson = ++idx;
}
dfs1(t[x].lson, val, dept + 1);
} else {
if (t[x].rson == -1) {
t[x].rson = ++idx;
}
dfs1(t[x].rson, val, dept + 1);
}
}
// 递归搜索答案
void dfs2(int x, int dept)
{
if (t[x].val == -INF) {
return;
}
if (maxv - dept < 2) {
res++;
}
if (t[x].lson != -1)
dfs2(t[x].lson, dept + 1);
if (t[x].rson != -1)
dfs2(t[x].rson, dept + 1);
}
int main(void)
{
int n, val;
cin >> n;
// 给树赋值
for (int i = 1; i <= n; i++) {
cin >> val;
dfs1(1, val, 1);
}
dfs2(1, 1);
cout << res << endl;
return 0;
}
2-4实在是不想写了,以后有机会再补上吧