HUSTCS NNZDQZRC 题解/答案分享(A-Z)

请注意 本题解暂时仅收录本人已经完成的题目,仅供参考,请勿直接抄袭~

本人码风非常凌乱且前7题是C后面都是C++ 具体语言类型已经标注到题目标题后面~

如果你也希望提供自己的题解/想法可以直接把代码copy到评论区~欢迎各种做法/语言qwq

小L在吃饭 ( hasmeal )

用 float 非常浪费资源,在签到题上没必要。本题直接将角作为单位即可

1
2
3
4
5
6
7
8
9
#include<stdio.h>
int main(void)
{
int a,b;
scanf(" %d %d", &a, &b);
int c = (10 * a + b) / 19;
printf("%d",c);
return 0;
}

小W在游泳 ( swim )

因为有98%所以开了 float ,用 sum 进行叠加即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(void)
{
float s, x = 2.0, sum = 0.0;
int i = 0;
scanf("%f", &s);
while (sum < s)
{
i++;
sum += x;
x *= 0.98;
}
printf("%d", i);
return 0;
}

小C在上课 ( finalscore )

注意到subtask 对于 的数据 均为 的倍数,因此直接当 int 算即可

1
2
3
4
5
6
7
8
#include <stdio.h>
int main(void)
{
int A, B, C;
scanf("%d %d %d", &A, &B, &C);
printf("%d", A / 5 + B / 10 * 3 + C / 2);
return 0;
}

好数 ( gnum )

四个情况对应 种情况,一个一个判断显然太慢了,我们用两个数把输入性质的真值存下来就好

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(void)
{
int x, a, b;
scanf("%d", &x);
a = (x/2*2 == x);
b = x > 4 && x <= 12;
printf("%d %d %d %d", (a&&b),(a||b),(a^b),!(a||b));
return 0;
}

排序 ( sort )

进行了一个毫无技术含量的冒泡排序

各种排序方法详情学习: OI Wiki - 排序简介

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
int main(void)
{
int a[3];
scanf("%d %d %d", &a[0], &a[1], &a[2]);
int i, j, temp;
for (i = 0; i < 2; i++)
{
for (j = 1; j < 3 - i + 1; j++)
{
if (a[j] < a[j - 1])
{
temp = a[j - 1];
a[j - 1] = a[j];
a[j] = temp;
}
}
}
printf("%d %d %d", a[0], a[1], a[2]);
return 0;
}

谁更短 ( leauingz )

注意到

时,自己出题更快,当 时,让 LeauingZ 出题更快。

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(void)
{
int n;
scanf("%d", &n);
if (n < 6)
printf("Local");
else
printf("Luogu");
return 0;
}

倍减 ( double )

由于 C 语言整数除法本身就是向下取整,因此直接按题意实现即可。

此处可以将 while 改写成 for 循环。

1
2
3
4
5
6
7
8
9
10
11
12
#include<stdio.h>
int main(void)
{
int x,i = 0;
scanf("%d", &x);
while(x != 1) {
i++;
x /= 2;
}
printf("%d", i+1);
return 0;
}

有说服力的评分算法 ( rating )

注意分数应该是浮点型变量,同时需要保留两位小数。

可以学习从 排序 ( sort ) C 学习来的排序方法,对评分数组进行排序。

但是本题只需要去掉两边各一个极值,因此直接累加并找到需要剪掉的项即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main(void)
{
float score = 0.0;
int a[1000] = {0};
int max = 0,min = 100;
int i,n;
scanf("%d", &n);
for(i = 0; i < n; i++) {
scanf(" %d", &a[i]);
score += a[i];
if(max < a[i]) max = a[i];
if(min > a[i]) min = a[i];
}
printf("%.2f", (score-max-min) / (n - 2));
return 0;
}

多项式筛素数 ( poly )

基本思路是从 开始创建向上的索引,判断每个索引是不是素数,然后再将是素数的项累加起来判断是不是大于 。代码实现的时候图省事把2单独拿出来考虑了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
int main(void)
{
int i = 0, j = 0, S = 0, sum = 2, n = 0, status = 0;
scanf("%d", &S);
if(S >= 2) {
printf("2\n");
n++;
}
for (i = 3; i < 5000 && (sum + i) <= S; i++)
{
status = 1;
for (j = 2; j < i; j++)
{
if (i == i / j * j)
{
status = 0;
break;
}
}
if (status == 1)
{
sum += i;
printf("%d\n", i);
n++;
}
}
printf("%d", n);
return 0;
}

数位枚举 ( enum )

注意到 Subtasks 里面的数据满足 ,因此直接在有限的范围内写 if 拆数就可以了2333

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
int main(void)
{
int i, n, x, t = 0;
scanf("%d %d", &n, &x);
for (i = 1; i <= n; i++)
{
if (i / 1000000 == x && i > 999999)
t++;
if (i / 100000 % 10 == x && i > 99999)
t++;
if (i / 10000 % 10 == x && i > 9999)
t++;
if (i / 1000 % 10 == x && i > 999)
t++;
if (i / 100 % 10 == x && i > 99)
t++;
if (i / 10 % 10 == x && i > 9)
t++;
if (i % 10 == x)
t++;
}
printf("%d", t);
return 0;
}

阅读论文 ( read )

根据 ,我们首先要区分 没有存储元素的位置 和 存放了 的位置。因此在初始化的时候为数组置-1.

这一步可以拿memset()函数快速完成。

之后查找论文里有没有已知的公式。

如果有 继续下一个

如果没有 在笔记本里记录,同时计数器自增。

我们用一个类似于指针的东西记录下一个要记录的页码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
int main(void)
{
int Mi, Ni, M[1001], N[1001], i, j, check_time = 0;
for (i = 0; i < 1001; i++)
{
M[i] = -1;
N[i] = -1;
} // MNP置-1
scanf("%d %d", &Mi, &Ni);
for (i = 0; i < Ni; i++)
scanf(" %d", &N[i]);
int index = 0, status = 0;
for (i = 0; i < Ni; i++)
{
status = 0;
for (j = 0; j < Mi; j++)
{
if (N[i] == M[j])
{
status = 1;
break;
}
}
if (status == 0)
{
if (index == Mi)
index = 0;
M[index] = N[i];
index++;
check_time++;
}
}
printf("%d", check_time);
return 0;
}

在线购物 ( shopping )

从本题开始全部由 C++ 编写,因为它提供了众多功能强大的 STL 容器以及 string 类型。

当然本题其实还是个数学问题 直接取模做就好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>

typedef struct an
{
int code;
} Ni; //回看补充 就一个int我为什么要定义一个struct/捂脸

typedef struct aq
{
int length;
int recode;
} Qi;

int main()
{
int n, q, i;
Ni N[1000];
Qi Q[1000];
scanf("%d %d", &n, &q);
for (i = 0; i < n; i++)
{
scanf(" %d", &N[i].code);
}
for (i = 0; i < q; i++)
{
scanf(" %d %d", &Q[i].length, &Q[i].recode);
}

int c = 10;
int cmp = 1000000000;
for (int i = 0; i < q; i++)
{
c = pow(10, Q[i].length);
cmp = 1000000000;
for (int j = 0; j < n; j++)
{
if (N[j].code % c == Q[i].recode && N[j].code < cmp)
cmp = N[j].code;
}
if (cmp == 1000000000)
printf("-1\n");
else
printf("%d\n", cmp);
}

system("pause");
return 0;
}

lhm 玩 01 ( lhma )

本题是学长相互迫害的开端哈哈

我们把输出 作为两种状态,然后一次处理即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <bits/stdc++.h>

int main(void)
{
int i, j, a, b = 0, index = 0;
int sum = 0;
scanf(" %d", &j);
while (sum < j * j)
{
scanf(" %d", &i);
sum += i;
for (a = 0; a < i; a++)
{
if (b == 0)
printf("0");
else
printf("1");
index++;
if (index % j == 0 && index != 0 && index != j * j)
printf("\n");
}
b = 1 - b;
}

system("pause");
return 0;
}

bngg 与 hmgg 的决斗 ( fight )

注意本题只保证每一个节点 ,因此累加时要开 long long

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;
int main(void)
{
long long n;
long long c[100000];
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> c[i];
}
long long m, p1, s1, s2;
long long p2;
scanf(" %lld", &m);
scanf(" %lld", &p1);
scanf(" %lld", &s1);
scanf(" %lld", &s2);
long long k1 = 0, k2 = 0, temp = 100000000000000000, tag;
for (int i = 0; i < n; i++)
{
k1 += c[i] * (m - 1 - i);
}
k1 += (m - p1) * s1;
for (p2 = 0; p2 < n; p2++)
{
k2 = abs(k1 + (m - 1 - p2) * s2);
if (temp > k2)
{
temp = k2;
tag = p2;
}
}

printf("%lld", tag + 1);

system("pause");
return 0;
}

lhm 玩数字 ( lhmb )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <cstdlib>

using namespace std;

void swap(int *a, int *b)
{
int temp = *a;
*a = *b;
*b = temp;
}

void Bs(int c[], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 1; j < n - i; j++)
{
if (c[j] < c[j - 1])
swap(&c[j], &c[j - 1]);
}
}
}

int main(void)
{
int n, k;
cin >> n >> k;
int c[10000];
for (int i = 0; i < n; i++)
{
cin >> c[i];
}
Bs(c, n);

int tag = 1;
for (int i = 1; i < n; i++)
{
if (c[i] != c[i - 1])
tag++;
if (tag == k) {
cout << c[i];
break;
}
}
if (tag < k)
cout << "NO RESULT";

system("pause");
return 0;
}

小 S 与 NLP ( nlp )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <bits/stdc++.h>

using namespace std;

int main(void)
{
int n, m;
cin >> n >> m;
unordered_map<string, int> dict;

for (int i = 0; i < n; ++i)
{
string key;
int val;
cin >> key >> val;
dict[key] = val;
}

cin.ignore(1000, '\n');

for (int i = 0; i < m; ++i)
{
string m1;
getline(cin, m1);
string m2;
bool status = false;
string current_key;

for (char c : m1)
{
if (c == '{')
{
status = true;
current_key.clear();
}
else if (c == '}')
{
status = false;
m2 += to_string(dict[current_key]);
}
else
{
if (status)
{
current_key += c;
}
else
{
m2 += c;
}
}
}

cout << m2 << endl;
}

system("pause");
return 0;
}

小 S 与 MMORPG ( mmorpg )

至理名言

如果你不知道什么是 MMORPG,你可以将其简单理解为 Many Men Online Role Playing as Girls 的缩写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;

int main()
{
set<string> s;
int n, m, k;
string w;

cin >> n >> m >> k;
for (int i = 0; i < n; i++)
{
cin >> w;
s.insert(w);
}
for (int i = 0; i < m; i++)
{
cin >> w;
s.erase(w);
}
for (int i = 0; i < k; i++)
{
cin >> w;
s.insert(w);
}
for (string c : s)
{
cout << c << endl;
}
system("pause");
return 0;
}

小 S 与时间逆流 ( time )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
using namespace std;

int getlength(char *c)
{
int p = 0;
while (c[p] != 0)
{
p++;
}
return p;
}

int main()
{
char w[100];
memset(w, 0, 100);
cin >> w;
multiset<string> ms;
int i, j, a, b;
char w2[100];
int wlength;
wlength = getlength(w);
for (i = 0; i < wlength; i++)
{
for (j = wlength - 1; j > i; j--)
{
for (int k = 0; k < 100; k++)
w2[k] = w[k];
a = i;
b = j;
while (a < b)
{
w2[a] = w[b];
w2[b] = w[a];
a++;
b--;
}
string str(w2, wlength);
ms.insert(str);
}
}
string str(w,wlength);
ms.insert(str);
cout << *(ms.begin());
system("pause");
return 0;
}

小 S 与 历史长河 ( history )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <bits/stdc++.h>
using namespace std;

int main()
{
string S, S1, T, T1;
cin >> S >> T;
int Q;
cin >> Q;
int ls, rs, lt, rt;
for (int i = 0; i < Q; i++)
{
cin >> ls >> rs >> lt >> rt;
string S1(S, ls - 1, rs - ls + 1);
string T1(T, lt - 1, rt - lt + 1);
if (S1 < T1)
cout << "yifusuyi" << endl;
else if (S1 > T1)
cout << "erfusuer" << endl;
else
cout << "ovo" << endl;
}
system("pause");
return 0;
}

任务管理 ( task )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using namespace std;
int tasks[5000][5000];
set<int> lists;

void check(int b)
{
for (int i = 0; i < tasks[b - 1][0]; i++)
{
if (lists.find(tasks[b - 1][i + 1]) == lists.end())
{
lists.insert(tasks[b - 1][i + 1]);
check(tasks[b - 1][i + 1]);
}
}
}

int main()
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
cin >> tasks[i][0];
for (int j = 0; j < tasks[i][0]; j++)
scanf("%d",&tasks[i][j + 1]);
}
check(1);
cout << lists.size() + 1;
system("pause");
return 0;
}

直接输出 ( output )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <bits/stdc++.h>
using namespace std;

string de(int n)
{
string output = "";
int sum = 0;
bool k[16] = {0};
bool status = 0;
while (sum != n)
{
int i = 1;
int counter = 0;
while (i <= n - sum)
{
i *= 2;
counter++;
}
k[counter - 1] = 1;
sum += (i / 2);
}
for (int j = 15; j >= 0; j--)
{
if (k[j] == 1 && j != 0)
{
if (status)
output += "+";
if (j != 1)
output += "2(" + de(j) + ")";
else
output += "2";
status = 1;
}
else if (k[j] == 1 && j == 0)
{
if (status)
output += "+";
output += "2(0)";
}
}
return output;
}

int main()
{
int n;
cin >> n;
cout << de(n);
system("pause");
return 0;
}

走 ( walk )

这不是题解,只是一份无厘头的错误代码。本题还没通过,太困难了qwq

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <bits/stdc++.h>
using namespace std;

bool m_used = false;
int color = 0;
int qp[100][100];
int m, n;
int coin = -1;
set<pair<int, int>> his;
set<int> bill;
int recorder[10000] = {0};
int turn = 0;
int sum = 0;

int check(int x, int y)
{
pair<int, int> pos = make_pair(x, y);
if(his.find(pos) == his.end()) {his.insert(pos);}
else {return 0;}
color = qp[y - 1][x - 1];

if(color != -1) m_used = 0;
if(m_used == 0 && color == -1) m_used = 1;
if(m_used && color == -1) { his.erase(pos); return 0;}

if(x <= 0 || x >= m + 1 || y <= 0 || y >= m + 1) {his.erase(pos); return 0;}

if(x == m && y == m) {return 1;}

if (x > 1 && check(x - 1, y)) return 1;
if (x < m && check(x + 1, y)) return 1;
if (y > 1 && check(x, y - 1)) return 1;
if (y < m && check(x, y + 1)) return 1;

his.erase(pos);
return 0;
}

int main(void)
{
cin >> m >> n;

memset(qp, -1, 10000);

for (int i = 0; i < n; i++)
{
int x = 0, y = 0;
cin >> x >> y;
cin >> qp[y - 1][x - 1];
}

cout << check(1, 1);

system("pause");
return 0;
}

选择 ( choose )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <bits/stdc++.h>
using namespace std;

bool used[20] = {0};
int com[20] = {0};
int n, k;
int ans = 0;
int x[20] = {0};

int sum(void)
{
int sum = 0;
for (int i = 0; i < k; i++)
{
sum += com[i];
}
return sum;
}

bool check_prime(int num)
{
if (num == 1)
return false;
for (int i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
{
return false;
}
}
return true;
}

void comGet(int start, int layer)
{
if (layer == k)
{
if (check_prime(sum()))
ans++;
else
return;
}
for (int i = start; i < n; i++)
{
if (!used[i])
{
used[i] = true;
com[layer] = x[i];
comGet(i + 1, layer + 1);
used[i] = 0;
}
}
}

int main(void)
{

cin >> n >> k;

for (int i = 0; i < n; i++)
{
cin >> x[i];
}
comGet(0, 0);
cout << ans;

system("pause");
return 0;
}

大物要挂了 ( nnzdqzrc )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <bits/stdc++.h>
using namespace std;

int s1, s2, s3, s4;
set<int> total;
vector<int> man(2, 0);

void dfs(vector<int> man, int er, int layer, vector<int> &sub)
{
int top = sub.size();
if (layer == top)
{
int a = max(man[0], man[1]);
total.insert(a);
return;
}
if (layer != -1)
man[er] += sub[layer];
dfs(man, 0, layer + 1, sub);
dfs(man, 1, layer + 1, sub);
}
int main(void)
{
cin >> s1 >> s2 >> s3 >> s4;
vector<int> A(s1), B(s2), C(s3), D(s4);
for (int i = 0; i < s1; i++)
{
scanf(" %d", &A[i]);
}
for (int i = 0; i < s2; i++)
{
scanf(" %d", &B[i]);
}
for (int i = 0; i < s3; i++)
{
scanf(" %d", &C[i]);
}
for (int i = 0; i < s4; i++)
{
scanf(" %d", &D[i]);
}
dfs(man, 0, -1, A);
int result = *total.begin();
total.clear();
dfs(man, 0, -1, B);
result += *total.begin();
total.clear();
dfs(man, 0, -1, C);
result += *total.begin();
total.clear();
dfs(man, 0, -1, D);
result += *total.begin();

cout << result;
system("pause");
return 0;
}

世界是一个巨大的二分 ( binary )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <bits/stdc++.h>
using namespace std;

void SuperFunc(int option, vector<int> &a)
{
vector<int>::iterator iter1;
vector<int>erator iter2;
::it
int x, y, counter = 0;
int length = a.size();
if (option == 1)
cin >> x;
else
cin >> x >> y;
switch (option)
{
case 1:
iter1 = lower_bound(a.begin(), a.end(), x);
iter2 = upper_bound(a.begin(), a.end(), x);
counter = distance(iter1, iter2);
break;
case 2:
iter1 = lower_bound(a.begin(), a.end(), x);
iter2 = upper_bound(a.begin(), a.end(), y);
counter = distance(iter1, iter2);
break;
case 3:
iter1 = lower_bound(a.begin(), a.end(), x);
iter2 = lower_bound(a.begin(), a.end(), y);
counter = distance(iter1, iter2);
break;
case 4:
iter1 = upper_bound(a.begin(), a.end(), x);
iter2 = upper_bound(a.begin(), a.end(), y);
counter = distance(iter1, iter2);
break;
case 5:
iter1 = upper_bound(a.begin(), a.end(), x);
iter2 = lower_bound(a.begin(), a.end(), y);
counter = distance(iter1, iter2);
break;
}
if (counter < 0)
counter = 0;
cout << counter << endl;
}
int main(void)
{
int n, m, p;
cin >> n >> m;
vector<int> a(n);
for (int i = 0; i < n; i++)
scanf(" %d", &a[i]);
sort(a.begin(), a.end());
for (int i = 0; i < m; i++)
{
scanf(" %d", &p);
SuperFunc(p, a);
}

system("pause");
return 0;
}

方程求解 ( answer )

本题尚未开始做qwq

1
2
3
4
5
6
7
#include<bits/stdc++.h>

int main(void)
{
cout << "我也不知道咋写的" << endl;
return 0;
}

你能做的,岂止如此!