PAT (Basic Level) Practice 1045~1066

PTA Basic Level Practice 解题思路和代码,主要用的是 C++。每22题一篇博客,可以按目录来进行寻找。

文章目录

  • 1045 快速排序
  • 1046 划拳
  • 1047 编程团体赛
  • 1048 数字加密
  • 1049 数列的片段和
  • 1050 螺旋矩阵
  • 1051 复数乘法
  • 1052 卖个萌
  • 1053 住房空置率
  • 1054 求平均值
  • 1055 集体照
  • 1056 组合数的和
  • 1057 数零壹
  • 1058 选择题
  • 1059 C语言竞赛
  • 1060 爱丁顿数
  • 1061 判断题
  • 1062 最简分数


1045 快速排序

思路:
对于每一个元素,如果其比左侧的最大值要大,比右侧的最小值要小,那么它就符合主元的定义,所以具体的做法就是:

先遍历一遍数组,找出每个元素左侧的最大值;再遍历一遍数组,找出每个元素右侧的最小值,最后遍历一遍数组,找出符合主元要求的所有数,最后打印输出。时间复杂度为 O ( n ) O(n) O(n)

  • 用 leftMax 数组来保存 A 中对应元素左侧的最大值。假设当前下标是 i,比较其前一个元素 A[i - 1] 和前一个元素左侧的最大值 leftMax[i - 1],谁更大,谁就是 A[i] 左侧的最大值;寻找右侧最小值同理。
  • 然后就是升序输出的问题,因为符合要求的主元都是比左侧的元素要大,因此放入到 ans 数组中的元素也一定是升序排列的。
  • 最后要注意一下输出的格式,第三个测试点中结果没有主元,所以输出第一行中主元的个数为0,第二行是一个空行,所以最后要加一句 cout << endl;
#include <iostream>
#include <vector>
using namespace std;int main()
{int n;cin >> n;vector<int> A(n), leftMax(n), rightMin(n), ans;for (int i = 0; i < n; ++i)cin >> A[i];leftMax[0] = 0, rightMin[n - 1] = 0x3fffffff;       // 最小值和最大值for (int i = 1; i < n; ++i)leftMax[i] = max(A[i - 1], leftMax[i - 1]);     // 寻找每个整数左侧的最小值for (int j = n - 2; j >= 0; --j)rightMin[j] = min(A[j + 1], rightMin[j + 1]);   // 寻找每个整数右侧的最大值for (int i = 0; i < n; ++i)if (leftMax[i] < A[i] && A[i] < rightMin[i])    // 将符合要求的数放入数组ans.push_back(A[i]);cout << ans.size() << endl;if (ans.size() > 0) cout << ans[0];     // 第一个数前不打印空格for (int i = 1; i < ans.size(); ++i)    cout << " " << ans[i];              // 除第一个数外每个数之前都打印一个空格cout << endl;   // 打印空行return 0;
}

另一种做法:在快速排序中,每一趟排序后,主元一定到达了最终的位置。因此先对初始数组进行拷贝,然后对它进行排序。排序后对两个数组进行逐个元素的比较,元素位置不发生变化且比左侧的最大值都要大的元素一定可以做主元。

另外提一点,在对数据进行频繁的访问操作时,数组的效率要比 vector 高很多。但这不能说明数组一定比 vector 好,vector 拥有很多强大的功能,也可以存储很多种类型,相比之下数组还是太单一了点。如果只是对一组数据进行简单的频繁访问,可以选择数组,否则用 vector 更加方便。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> ans;
int main()
{int n, max = 0;cin >> n;vector<int> a(n);for (int i = 0; i < n; ++i)cin >> a[i];vector<int> b = a;          // 拷贝初始数组sort(a.begin(), a.end());   // 对数组进行排序for (int i = 0; i < n; ++i){if (a[i] == b[i] && b[i] > max) // 符合要求的主元放入数组 ansans.push_back(b[i]); max = b[i] > max ? b[i] : max;  // 更新最大值}cout << ans.size() << endl;if (ans.size() > 0) cout << ans[0];for (int i = 1; i < ans.size(); ++i)cout << " " << ans[i];cout << endl;return 0;
}

1046 划拳

#include <iostream>
using namespace std;int main()
{int ashout, bshout, cshout, ahua, bhua, acnt, bcnt, n;cin >> n;acnt = bcnt = 0;while (n--){cin >> ashout >> ahua >> bshout >> bhua;cshout = ashout + bshout;if (cshout == ahua && cshout == bhua)continue;else if (cshout == ahua) ++bcnt;else if (cshout == bhua) ++acnt;}cout << acnt << " " << bcnt;return 0;
}

1047 编程团体赛

#include <iostream>
#include <cstring>
using namespace std;int main()
{int n, team, num, score, hashTable[1000] = {0};cin >> n;int chpteam = -1, chpscore = -1;char c;while (n--){cin >> team >> c >> num >> score;	// 用 c 过滤队员和队伍编号之间的 '-'hashTable[team] += score;if (hashTable[team] > chpscore){chpteam = team;chpscore = hashTable[team];}}cout << chpteam << " " << chpscore;return 0;
}

1048 数字加密

思路:
将整数 A 和 B 分别倒置,此时就将整数的个位放到了字符串的第一位。然后获取两者的长度,对于较短的,在字符串的末尾补上 ‘0’,相当于在整数的高位补了0。然后从字符串的最后一位(整数的最高位)开始遍历,一直到字符串的第一位(整数的个位),逐个加密逐个输出即可得到加密后的结果,这样就就省去了再定义一个 string 对象保存加密结果了。

注意:

  • 位数不够需要补0参与加密,而不是将多余的字符直接输出。
  • 奇数位,偶数位指的是数位的奇偶性,而不是位上的数字的奇偶性。
  • i 从 max(lena, lenb) 开始不断减小,而不是 lena 或 lenb,否则会漏解的。
  • 用的是下标遍历,下标是偶数时,对应的是奇数位,规则是反过来的。

经验:

  • 用 string C; 来代替 char C[13]; 数组更加简便。
  • 三元运算符的效率比 if-else 更高。
  • 判断下标奇偶性可以用与运算,效率更高。x & 1,结果为1是奇数,结果为0是偶数,和奇偶判断是一样的。注意不能写成 i & 1 ==
    0,因为 ‘==’ 的运算优先级比 ‘&’ 更高,写成这样会先运算 1 == 0 倒置全是 false 了。取而代之可以写成 (i & 1) == 0 或者 !(i & 1)。
  • reverse() 函数用于将数组或字符串倒置,在头文件 algorithm 中。
  • append() 函数是在字符串的末尾添加指定个数的字符,头文件 iostream 就已经包含了
#include <iostream>
#include <algorithm>
using namespace std;int main()
{string A, B, C = "0123456789JQK";cin >> A >> B;reverse(A.begin(), A.end());    // 字符串倒置reverse(B.begin(), B.end());int lena = A.size(), lenb = B.size();lena > lenb ? B.append(lena - lenb, '0') : A.append(lenb - lena, '0');  // 补0for (int i = max(lena, lenb) - 1; i >= 0; --i)  // 从最高位开始{if (!(i & 1))cout << C[(B[i] - '0' + A[i] - '0') % 13];elsecout << ((B[i] - A[i]) + 10) % 10;}return 0;
}

1049 数列的片段和

#include <iostream>
#include <iomanip>
using namespace std;int main()
{int n;long double v, ans = 0; // ans 必须要用 long double 型来定义,否则会导致测试点3超时cin >> n;for (int i = 1; i <= n; ++i){cin >> v;ans += v * i * (n + 1 - i); // 第 i 位的总出现次数为 v * i * (n + 1 - i)}cout << setiosflags(ios::fixed) << setprecision(2) << ans << endl;return 0;
}

1050 螺旋矩阵

思路:
寻找 m - n 最小差值的过程类似于判断是否为素数,其实也就是寻找 N 的最接近因子对的过程,从 n = 1 枚举到 n * n > N,如果 N 能被 n 整除,就令 m = N / n。在退出循环后得到的就是满足 m - n 差值最小的 m,也是大于等于 N \sqrt N N 中最小的一个因子。然后再令 n = N / m 即可得到满足 m - n 差值最小的 n。用 sort() 函数对输入的数组 A 进行排序,用 memset() 函数将二维螺旋数组 B 的所有元素初始化为0。

然后在 while 循环中将 A 数组的元素依次填充到数组 B 中,因为 sort() 函数是从小到大的排序,所以我用 k 来标记数组的尾部下标,填充一个 k 的值就减1,当 k 的值小于0时表明填充完了,从而退出 while 循环。填充过程的基本思路是,用 d 的值来标记填充的方向,继续当前方向填充的标志是 B[i][j] = 0 且 i 或 j 并未到达数组边界。因为题目表明了输入的都是正整数,所以可以用元素值为0表明还没有被填充过

在这里插入图片描述

注意:

  • i 和 j 要初始化为 -1,因为第一次进入 for 循环时 i 和 j 分别加了1。
  • 退出一个 for 循环后,i 和 j 的值会与一开始填充的路线偏离,所以在下一个 for 循环时加1或减1来让路线回正。

经验:

  • 对于任意一个正整数 N,其因子对中,一定有一个 ≤ N \le \sqrt N N ,而另一个 ≥ N \ge \sqrt N N ,因此 N 只需要从 1 枚举到 N \sqrt N N
  • 二维数组的初始化用 memset() 函数就很方便。
  • 对于这种模拟类的题目,详细的写出其过程更有助于理清解题思路。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;int main()
{int N, m, n, d = 0, i = -1, j = -1, k = 0;cin >> N;for (n = 1; n * n <= N; ++n)    // 寻找满足大于根号 N 却又最小的因子 mm = N % n == 0 ? N / n : m;n = N / m, k = N - 1;int A[N], B[m][n];for (int l; l < N; ++l) cin >> A[l];sort(A, A + N);             // 排序memset(B, 0, sizeof(B));    // 初始化螺旋数组while (k >= 0){if (d == 0)         // ++i, ++j 的过程就是路线回正的过程for (++i, ++j; B[i][j] == 0 && j < n; ++j) B[i][j] = A[k--];else if (d == 1)    // ++i, --j 也是使路线回正的做法for (++i, --j; B[i][j] == 0 && i < m; ++i) B[i][j] = A[k--];else if (d == 2)for (--i, --j; B[i][j] == 0 && j >= 0; --j) B[i][j] = A[k--];elsefor (--i, ++j; B[i][j] == 0 && i >= 0; --i) B[i][j] = A[k--];d = (d + 1) % 4;}for (i = 0; i < m; ++i){cout << B[i][0];for (j = 1; j < n; ++j)cout << " " << B[i][j];cout << endl;}return 0;
}

1051 复数乘法

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;int main(){double r1, r2, p1, p2;double a, b;cin >> r1 >> p1 >> r2 >> p2;a = (r1 * r2) * cos(p1 + p2);b = (r1 * r2) * sin(p1 + p2);if(fabs(a) < 0.01) a = 0;if(fabs(b) < 0.01) b = 0;if(b < 0)cout << setiosflags(ios::fixed) << setprecision(2) << a << "-" << fabs(b) << "i";elsecout << setiosflags(ios::fixed) << setprecision(2) << a << "+" << fabs(b) << "i";return 0;
}

1052 卖个萌

题目有一个隐含条件没有说明:左手和左眼之间要加左括号,右眼和右手之间要加右括号。这一题我不知道为什么控制端就是不能输出特殊字符,所以索性就不做了,贴上柳神代码的链接:1052. 卖个萌 (20)-PAT乙级真题。


1053 住房空置率

#include <iostream>
#include <iomanip>
using namespace std;int main()
{int N, D, K, cnt = 0;  // m 可能空置,n 空置  float e, ei, m = 0, n = 0;cin >> N >> e >> D;for (int i = 0; i < N; ++i, cnt = 0){cin >> K;for (int j = 0; j < K; ++j){cin >> ei;if (ei < e) ++cnt;  // 用电量小于给定阈值 e,计数+1}if (cnt > K / 2) K <= D ? ++m : ++n;    // 符合条件1的前提下,不符合条件2,可能空置;否则空置  }cout << setiosflags(ios::fixed) << setprecision(1) << m / N * 100 << "% " << n / N * 100 << "%";return 0;
}

1054 求平均值

思路:
读者可以阅读一下PAT OJ 刷题必备知识总结 12 sscanf 与 sprintf 中的内容。sscanf 会将 a 中符合 %lf 格式的内容写入 temp,sprintf 会将 temp 中的内容以 %.2lf 的格式写入 b。执行完这两步后,比较 a 中的每一位与 b 中的对应位是否相等,只有符合题目要求的数才会相等。如果不相等,令 flag 等于1。然后进行判断,只有同时满足 falg 为0,temp 的值在 [-1000, 1000] 之内才是题目所求的合法数。然后更新和与计数,最后按照题目规定的格式输出即可。输出的时候要注意,只有一个合法数时,应当输出 “number” 而不是 “numbers”。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
using namespace std;
int main()
{int n, cnt = 0, flag = 0;double temp = 0.0, sum = 0.0;char a[50], b[50];cin >> n;for (int i = 0; i < n; ++i, flag = 0){cin >> a;sscanf(a, "%lf", &temp);    // 将 a 中的内容以浮点数的格式写入 tempsprintf(b, "%.2f", temp);   // 将 temp 中的内容以 %.2f 的格式写入 bfor (int j = 0; j < strlen(a); ++j) // 存在不对应的字符,flag = 1表明不匹配if (a[j] != b[j]) flag = 1;if (flag || temp < -1000 || temp > 1000)cout << "ERROR: " << a << " is not a legal number" << endl;else{sum += temp;    // 更新和cnt++;          // 更新计数}}if (cnt == 1)cout << "The average of 1 number is " << setiosflags(ios::fixed) << setprecision(2) << sum;else if (cnt > 1)cout << "The average of " << cnt << " numbers is " << setiosflags(ios::fixed) << setprecision(2) << sum / cnt;else cout << "The average of 0 numbers is Undefined";return 0;
}

1055 集体照

思路:
这一题首先要结合测试用例仔细理解一下题目的意思,按照排队规则还原一下队伍的情况如下所示,可以知道它的排列是整体先从高到低,然后身高相等时再按照字典序排序。因此在得到输入后应首先按要求对整个队伍进行一次排列。要使名字和身高同时更换顺序,最好就是用结构体。定义一个结构体数组 person 来保存所有的排队人员。
在这里插入图片描述

解决了排序问题,就需要将所有人依次按照规则放入每一行中。由于说了后排的人输出在上方,所以很自然地我们就能从数组的头部一个个往每一行排入。用 n 来标记目前该排哪个人,用 r 来表明排到了哪一行,两者初始值都为0。用 m 来表示每一行需要排多少人,最上方一行需要 N % K + N / K(想一想为什么?)个人,下方的每一行都是 N / K 个人。因为当 r = 0 时 m = N % K + N / K。假设现在在第一行,需要排四个人,也就是 Joe,Tom,Nick 和 Bob。按照题目要求,就是先把最高的 Joe 排好,后面就一个放 Joe 的右边,一个放 Joe 的左边,以此往复,而在我们的视角内,就是先排好 Joe,然后 Tom 放左边,Nick 放右边,Bob 又放到左边。如果用一个数组 line 来表示当前行,那么就应该是如下的形式:
在这里插入图片描述

所以我的思路就是,在排每一行的人时,将 person 数组中下标 n ~ n + m 的人依次拿出来放入 line 数组,先放左边的,再放中间最高的,最后放右边的。中间的位置是 m / 2(比如一行4个人时,中间位置的下标就是 4 / 2 = 2;一行3个人时,中间位置的下标就是 3 / 2 = 1),用 j 来标记应该放在 line 数组中的哪个位置。

用 i 来标记 person 数组,而 person[n] 固定是放在中间位置的。排左边时,i 从 n +1 开始,因为是先放一个左边,再放一个右边,所以 i 每次循环是自增2;而 j 是从 m / 2 - 1 开始往 0 的方向走,然后将 person[i].name 给到 line[j]即可。右边 j 则是从 m / 2 + 1 开始往 m 的方向走,i 依然是每次循环自增2。排完一行后,进入下次循环前,要令 n += m,因为有 m 个人已经排完了。

注意:
我一开始用的是双端队列来表示每一行,然后用 push_front 和 push_back 来实现左插入和右插入,这样就不用考虑数组下标的问题。但是会超时,所以才改用直接通过下标访问数组的方式(毕竟插入元素需要移动比直接访问更耗时)。

经验:

  • 两个条件的 cmp 函数用一个三目运算符就能实现,新技能 get。
  • 不需要用二维数组来保存,排完一行就输出一行,空间利用更少,代码也更简洁。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;struct Person
{string name;int height;
} person[10005];bool cmp(const Person a, const Person b)
{return a.height == b.height ? a.name < b.name : a.height > b.height;
}int main()
{int N, K, n = 0;cin >> N >> K;for (int i = 0; i < N; ++i)cin >> person[i].name >> person[i].height;sort(person, person + N, cmp);      // 先按身高排序,后按名字字典序排序for (int r = 0; r < K; ++r){int m = r == 0 ? N % K + N / K : N / K;vector<string> line(m, "");     // 数组大小为 m,初始化为空串for (int i = n + 1, j = m / 2 - 1; i < n + m && j >= 0; i += 2, --j)line[j] = person[i].name;   // 排左边的同学line[m / 2] = person[n].name;   // 排中间最高的同学for (int i = n + 2, j = m / 2 + 1; i < n + m && j < m; i += 2, ++j)line[j] = person[i].name;   // 排右边的同学n += m;cout << line[0];    // 第一个名字前不输出空格for (int i = 1; i < line.size(); ++i)cout << " " << line[i];cout << endl;}return 0;
}

1056 组合数的和

思路:
输入 N 个数,每个数字既可能做个位数也有可能做十位数,分别会出现 N - 1 次。所以每个数 n 所产生和是 (n * 10 + n) * (N - 1) = n * 11 * (N - 1)。

#include <iostream>
using namespace std;int main()
{int N, n, sum = 0;cin >> N;while (cin >> n)sum += 11 * n * (N - 1);cout << sum;return 0;
}

1057 数零壹

思路:
由于输入可能有空格,所以用 getline 来获取字符串。枚举字符串中的字符,若是字母,将其转换为小写字母后计算序号加到 sum 上。利用二进制除法来统计0和1的个数即可。

#include <iostream>
using namespace std;int main()
{int sum = 0, cnt_0 = 0, cnt_1 = 0;string s;getline(cin, s);for (int i = 0; i < s.size(); ++i)if (isalpha(s[i])) sum += tolower(s[i]) - 'a' + 1;while (sum){sum % 2 == 1 ? ++cnt_1 : ++cnt_0;sum /= 2;} ;cout << cnt_0 << " " << cnt_1;return 0;
}

1058 选择题

思路:
定义 score 数组保存每一题的满分,opts 为选项数,cor 为正确选项个数,ans 数组保存每一题的正确选项,也即正确答案。然后照常获取所有的输入,用一个 c = getchar() 来过滤掉输入流中的回车。

定义 stuScore 数组保存每个学生的得分,wrongCnt 数组保存每一题的错误次数,maxWrong 保存最大的错误次数。第一层 for 循环用 i 枚举每一个学生。因为每个学生的答题情况包含所有的选择题,且没有题号标记,只是用左右括号隔开然后顺序输入,所以用 cur 来记录题号,因此在每一层循环中都需要将题号 cur 置0。

因为学生的答题情况用一行字符串表示,而我思考后决定只对三种字符情况做判断,所以在这里用 c = getchar() 来处理比直接用 string 来接受一整行的输入更加方便。

  • 当 c 为 ‘(’ 时表明到了下一题,cur 加1且清空学生的选择 temp;
  • 当 c 为字母时,是学生的选择,将其加入 temp;
  • 当 c 为 ‘)’ 时就需要判断对错了,将 temp 与 ans[cur] 作比较,正确的话则增加得分 stuScore[i] += score[cur];错误的话该题错误次数 wrongCnt[cur] 加1。然后检查是否需要更新 wrongCnt。

输入完后按题目要求输出即可。

注意:
仔细思考和试错过后发现选项个数 opts、正确选项个数 cor 在后面用不上,所以就没有用数组来保存。因为即便加上“如果学生的选择数不等于正确选项个数判错”,由于数据量和选项数比较少,并不会带来更多的时长优化,而为此还需要多加一层判断,得不偿失。

#include <iostream>
using namespace std;int main()
{int N, M, a, score[105], opts, cor, cur;string ans[105], temp;cin >> N >> M;for (int i = 1; i <= M; ++i){cin >> score[i] >> opts >> cor;while (cor--){cin >> temp;    // cin 可以过滤掉正确选项之间的空格ans[i] += temp; // 将所有正确选项保存在 ans 中}}char c = getchar();     // 过滤掉输入流里的回车int stuScore[N + 1] = {0}, wrongCnt[M + 1] = {0}, maxWrong = 0;for (int i = 1, cur = 0; i <= N; ++i, cur = 0)// i 枚举每一个学生{while ((c = getchar()) != '\n'){if (c == '(')                   // 遇到左括号表明到了下一题{++cur;                      // 题号加1temp = "";                  // 清空 temp}else if (isalpha(c)) temp += c; // 将学生的选择加入 temp 中else if (c == ')')              // 遇到右括号就判断是对错{if (temp == ans[cur]) stuScore[i] += score[cur];else ++wrongCnt[cur];       // 题号为 cur 的错误数加1maxWrong = wrongCnt[cur] > maxWrong ? wrongCnt[cur] : maxWrong; // 更新最大错误数}}}for (int i = 1; i <= N; ++i) cout << stuScore[i] << endl;if (!maxWrong) cout << "Too simple";else{cout << maxWrong;for (int i = 1; i <= M; ++i)if (wrongCnt[i] == maxWrong) cout << " " << i;}return 0;
}

1059 C语言竞赛

思路:
基本思路就是定义一个 map 字典: id_pz_ck,其中键是参赛者的 ID,值是一个 pair;pair 的 first 成员是奖品,second 成员是布尔值,表明其是否被查询过。

通过 insert 函数来将新的键值对插入到 map 中,构造键值对的方式是用花括号括起来。通过 find() 函数来查找键是否在字典中,返回的是指向该键的迭代器,如果没有这个键,返回的就是字典的尾后迭代器。

#include <iostream>
#include <map>
using namespace std;bool isPrime(int n) // 判断是否是素数
{for (int i = 2; i * i <= n; ++i)if (n % i == 0) return false;return true;
}int main()
{int N, K, ifChecked[N];string id, prize, query;cin >> N;map<string, pair<string, bool>> id_pz_ck;for (int i = 1; i <= N; ++i)    // i 为排名{cin >> id;if (i == 1) id_pz_ck.insert({id, {"Mystery Award", false}});else if (isPrime(i)) id_pz_ck.insert({id, {"Minion", false}});else id_pz_ck.insert({id, {"Chocolate", false}});}cin >> K;while (K--){cin >> query;if (id_pz_ck.find(query) == id_pz_ck.end()) // 查询 id 不在字典中cout << query << ": Are you kidding?" << endl;else if (!id_pz_ck[query].second)           // 查询 id 在字典中,且布尔值为 false{cout << query << ": " << id_pz_ck[query].first << endl;id_pz_ck[query].second = true;          // 查询过该 id,布尔值变为 true}else cout << query << ": Checked" << endl;}return 0;
}

1060 爱丁顿数

思路:
将数组从大到小排序,排好序就是如下图所示:
在这里插入图片描述

然后从下标 i = 1 开始枚举数组中的元素。从题目的要求可以这么理解,当 i = 6 时,a[i] = 7,因为数组是递减的,说明从 1 ~ 6 这六天的英里数都是大于6的,就满足了 E = 6 (满足有 6 天骑车超过 6 英里)。当 i = 7 时,a[i] = 6,说明从 1 ~ 7 这七天的英里数不全都大于 7,不满足 E = 7。再往后就肯定都不满足了,所以输出前一个满足条件的 i,即 i - 1。

注意:

  • 超过,因此要用大于号。
  • 测试用例会出现如 3 3 3 3 5 这种,此时 E = 2;再如1 1 1 1 这种,此时 E = 0;再入 0 0 0 2 0,此时 E = 1;
#include <iostream>
#include <algorithm>
using namespace std;bool cmp(int a, int b) { return a > b; }int main()
{int N;cin >> N;int a[N + 1], i;for (int j = 1; j <= N; ++j)cin >> a[j];sort(a + 1, a + N + 1, cmp);for (i = 1; i <= N; ++i)if (i >= a[i]) break;cout << i - 1;return 0;
}

1061 判断题

#include <iostream>
using namespace std;int main()
{int N, M, n, score[105], ans[105];	// score 数组保存每道题的分数,ans 数组保存每道题的答案cin >> N >> M;for (int i = 0; i < M; ++i) cin >> score[i];for (int i = 0; i < M; ++i) cin >> ans[i];while (N--){int total = 0;				// 学生得分for (int i = 0; i < M; ++i) // i 为题目序号{cin >> n;   // 学生的解答if (n == ans[i]) total += score[i];}cout << total << endl;}return 0;
}

1062 最简分数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/77669.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

拷贝构造函数(深拷贝+浅拷贝)

目录 拷贝构造函数浅拷贝深拷贝 拷贝构造函数 拷贝构造函数&#xff1a; Myclass(const Myclass& myclass) {amyclass.a;bmyclass.b;cmyclass.c; }浅拷贝 浅拷贝的思路就是和默认的拷贝构造函数一样: 即将原对象的值直接赋值给新对象&#xff0c;这样做一般情况下是没什…

Java“牵手”淘宝商品详情数据,淘宝商品详情接口,淘宝API接口申请指南介绍

采集场景 在淘宝首页&#xff08;taobao.com&#xff09;输入关键词搜索&#xff0c;采集搜索后得到的商品列表页数据然后再点击进去即是商品详情页面数据。示例中关键词为【新款连衣裙】&#xff0c;可根据需求进行更换&#xff0c;同时支持自动批量输入多个关键词&#xff0…

解读|美创深度参与5项电信和互联网行业数据安全标准发布实施

《数据安全法》、《个人信息保护法》等法律法规的颁布实施&#xff0c;坚持安全和发展并重的原则&#xff0c;积极应对复杂严峻的安全风险与挑战&#xff0c;加速构建数据安全保障体系&#xff0c;成为电信和互联网行业重要工作。 “安全发展、标准先行”&#xff0c;标准化工作…

力扣 -- 646. 最长数对链

参考代码&#xff1a; class Solution { public:int findLongestChain(vector<vector<int>>& pairs) {int npairs.size();sort(pairs.begin(),pairs.end());vector<int> dp(n,1);int ret1;for(int i1;i<n;i){for(int j0;j<i;j){if(pairs[j][1]<…

声音生成结果比较方法综述——FAD、JSD、NDB多种衡量参数

文章目录 引言正文Generation quality 生成质量FAD距离FAD论文总结FAD代码下载和安装FAD的使用 通过分类准确率衡量实现代码 Generation Deversity生成多样性NDBJSDNDB和JSD的实现代码代码修改和结果理解 NDB和JSD应用到声音生成 总结 引言 之前自己并没有对这方面的内容进行研…

【数据结构-堆】堆

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

异步FIFO设计的仿真与综合技术(2)

概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文&#xff0c;添加了笔者的个人理解与注释&#xff0c;文中蓝色部分为笔者注或意译。前文链接&#xff1a;异步FIFO设计的仿真与综合技术&#xff0…

Java集合面试

文章目录 Java集合框架说说有哪些常见的集合&#xff1f;ArrayList和LinkedList的区别&#xff1f;List和Set的区别&#xff1f;HashMap的数据结构&#xff1f;把你了解的所有都讲一讲&#xff1f;数据结构&#xff1a; put流程Hashmap的resize方法的执行过程&#xff1f;get流…

【算法与数据结构】530、LeetCode二叉搜索树的最小绝对差

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;二叉搜索树的性质是左子树的所有节点键值小于中间节点键值&#xff0c;右子树的所有节点键值大于中间节…

招聘寒冬中,Python 程序员如何突出重围?

在当前的就业市场中&#xff0c;许多人都在感叹“招聘寒冬”。 尤其是对于 Python 程序员来说&#xff0c;似乎面临着更大的挑战。 然而&#xff0c;我要说的是&#xff0c;挑战与机遇并存&#xff0c;只要我们能够找准自己的定位&#xff0c;提升自己的技能&#xff0c;Pyth…

运用谷歌浏览器的开发者工具,模拟搜索引擎蜘蛛抓取网页

第一步&#xff1a;按压键盘上的F12键打开开发这工具&#xff0c;并点击右上角三个小黑点 第二步&#xff1a;选择More tools 第三步&#xff1a;选择Network conditions 第四步&#xff1a;找到User agent一列&#xff0c;取消复选框的勾选 第五步&#xff1a;选择谷歌爬虫…

Spring框架中的Resource接口是什么,以及它在加载和访问资源时的关键作用

文章目录 什么是 Resource 接口&#xff1f;使用 Resource 加载资源使用 Resource 访问文件系统资源总结 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专栏&#xff1a;Java框架 ✨文章内…

通过小程序实现微信扫码授权登录,网站接入微信扫码登录功能(永久免费)

需求 网站如果想要实现微信扫码登录其实有很多种方案&#xff0c;常见的方案就是微信开放平台和微信公众号服务号。前者是目前大部分网站并且是微信认可的一种方式&#xff0c;后者是开发者发现服务号具备扫码关注后即可获取用户基本信息的能力后而开发的一种方式。 而这两者…

【深入解析spring cloud gateway】08 Reactor 知识扫盲

一、响应式编程概述 1.1 背景知识 为了应对高并发服务器端开发场景&#xff0c;在2009 年&#xff0c;微软提出了一个更优雅地实现异步编程的方式——Reactive Programming&#xff0c;我们称之为响应式编程。随后&#xff0c;Netflix 和LightBend 公司提供了RxJava 和Akka S…

腾讯云centos7.6安装部署备忘

1.Mysql 1.1 安装mysql wget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5.noarch.rpm yum install mysql-community-server 1.1.1 安装后重启 service mysqld restart 1.1.2 初次安装mysql&#xff0c;root账…

【Python】【Fintech】用Python和蒙特卡洛法预测投资组合未来收益

【背景】 想利用蒙特卡洛方法和yahoo,stooq等财经网站上的数据快速预测特定portfolio的收益。 【分析】 整个程序的功能包括 读取json中的portfolio组合创建蒙特卡洛模拟预测收益的算法创建从财经网站获得特定投资组合数据,并根据2的算法获得该Index或Portfolio收益预测结…

ARTS打卡第四周之删除链表倒数第几个节点、gdb start命令、扩散模型、如何学习分享

Algorithm 题目&#xff1a;删除链表倒数第 n 个结点 分析&#xff1a;可以把通过两个结点进行标记&#xff0c;有一个节点需要遍历得快点&#xff0c;简称为快结点&#xff0c;有个结点遍历得慢&#xff0c;简称为慢结点。快结点先停在正数第 n 个结点处&#xff0c;然后快慢…

蓝桥杯打卡Day7

文章目录 阶乘的末尾0整除问题 一、阶乘的末尾0IO链接 本题思路&#xff1a;由于本题需要求阶乘的末尾0&#xff0c;由于我们知道2*510可以得到一个0&#xff0c;那么我们就可以找出2的数和5的数&#xff0c;但是由于是阶乘&#xff0c;所以5的数量肯定是小于2的数量&#xf…

车载Android应用开发与分析 - 初试 SystemUI Plugin

在前面的视频、文章中我们介绍完了整个车载Android应用开发所需要的基础知识&#xff1a; 【视频文稿】车载Android应用开发与分析 - 走进车载操作系统 - 掘金【视频文稿】车载Android应用开发与分析 - AOSP的下载与编译 - 掘金【视频文稿】车载Android应用开发与分析 - 开发系…

Elasticsearch:为具有许多 and/or 高频术语的 top-k 查询带来加速

作者&#xff1a;Adrien Grand Disjunctive queries&#xff08;term_1 OR term_2 OR ... OR term_n&#xff09;非常常用&#xff0c;因此在提高查询评估效率方面它们受到了广泛关注。 Apache Lucene 对于评估 disjunctive queries 有两个主要优化&#xff1a;一方面用于详尽评…