文章目录
作为一个编程菜鸡,先刷刷前几题,八道题目争取6题有思路,5题能写出来,3题能AC(大佬勿嘲笑)。由于部分题目已经关闭,无法看到是否AC(以下代码可能无法通过全部测试用例),如有错误,请指出,O(∩_∩)O谢谢。
A:奖学金
全局题号7908 提交次数207 尝试人数40 通过人数32
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
- 输入
- 包含n+1行:
第1行为一个正整数n,表示该校参加评选的学生人数。
第2到n+1行,每行有3个用空格隔开的数字,每个数字都在0到100之间。第j行的3个数字依次表示学号为 j-1 的学生的语文、数学、英语的成绩。每个学生的学号按照输入顺序编号为1~n (恰好是输入数据的行号减1)。
所给的数据都是正确的,不必检验。
50%的数据满足:各学生的总成绩各不相同;
100%的数据满足: 6<=n<=300。 - 输出
- 共有5行,每行是两个用空格隔开的正整数,依次表示前5名学生的学号和总分。
- 样例输入
-
12345678910111213141516171819样例 #1:690 67 8087 66 9178 89 9188 99 7767 89 6478 89 98样例 #2:880 89 8988 98 7890 67 8087 66 9178 89 9188 99 7767 89 6478 89 98
- 样例输出
-
12345678910111213样例 #1:6 2654 2643 2582 2441 237样例 #2:8 2652 2646 2641 2585 258
C++实现
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 |
#include<iostream> #include<vector> #include<algorithm> using namespace std; struct node{ int id; int chinese; int math; int eng; int all; }; bool cmp(node a, node b){ if(a.all != b.all)return a.all > b.all; else return a.chinese > b. chinese; } int main(){ int n; cin>>n; vector<node> pool(n); for(int i = 0; i < n; i++){ pool[i].id = i + 1; cin>>pool[i].chinese>>pool[i].math>>pool[i].eng; pool[i].all = pool[i].chinese + pool[i].math + pool[i].eng; } sort(pool.begin(), pool.end(), cmp); for(int i = 0; i < 5; i++){ cout<<pool[i].id<<" "<<pool[i].all<<endl; } return 0; } |
B:高次同余方程求解
全局题号12750 提交次数69 尝试人数34 通过人数29
总时间限制: 1000ms 内存限制: 65536kB描述
解高次同余方程是数论里的一个基础问题。现在邀请你来解一个简单的高次同余方程,xk=1(mod n)。(注:xk=1(mod n)的意思是xk除以n的余数为1)
数据范围:n和k是整数,且0 < k < n < 1000
输入两个整数,分别为k和n。输出从小到大输出方程的所有满足0 < x < n的整数解x,每行输出一个。
样例输入
1 |
3 7 |
样例输出
1 2 3 |
1 2 4 |
提示需要注意中间计算结果的可能范围。
(a * b) % p = ((a % p) * (b % p)) % p
样例输入:
398 702
样例输出
1
53
649
701
C++实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include<stdio.h> int res(int x, int k, int n){ if(k == 1)return x % n; else return ((x % n) * res(x, k - 1, n)) % n; } int main(){ int k, n, i; scanf("%d%d", &k, &n); for(i = 1; i < n; i++){ if(res(i, k, n) == 1)printf("%d\n", i); } return 0; } |
C:二维数组回形遍历
全局题号7545 提交次数78 尝试人数35 通过人数29
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按回形从外向内顺时针顺序遍历整个数组。如图所示:
- 输入
- 输入的第一行上有两个整数,依次为row和col。
余下有row行,每行包含col个整数,构成一个二维整数数组。
(注:输入的row和col保证0 < row < 100, 0 < col < 100) - 输出
- 按遍历顺序输出每个整数。每个整数占一行。
- 样例输入
-
123454 41 2 3 412 13 14 511 16 15 610 9 8 7
- 样例输出
-
1234567891011121314151612345678910111213141516
C++实现
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<vector> using namespace std; int nextDir[4] = {0, 1, 2, 3}; int rightCnt, downCnt, leftCnt, upCnt; int v[101][101]; int main(){ int row, col; cin>>row>>col; for(int i = 0; i < row; i++){ for(int j = 0; j < col; j++){ scanf("%d", &v[i][j]); } } int flag = 1; int cnt = row * col; while(true){ for(int j = flag - 1; j <= col - flag - 1; j++){ cout<<v[flag - 1][j]<<endl; if(--cnt == 0)return 0; } for(int i = flag - 1; i <= row - flag; i++){ cout<<v[i][col - flag]<<endl; if(--cnt == 0)return 0; } for(int j = col - flag - 1; j >= flag - 1; j--){ cout<<v[row - flag][j]<<endl; if(--cnt == 0)return 0; } for(int i = row - flag - 1; i >= flag; i--){ cout<<v[i][flag - 1]<<endl; if(--cnt == 0)return 0; } flag++; } return 0; } |
H:拓扑排序
全局题号4865 提交次数30 尝试人数17 通过人数16
- 总时间限制:
- 10000ms
- 内存限制:
- 1000kB
- 描述
- 给出一个图的结构,输出其拓扑排序序列,要求在同等条件下,编号小的顶点在前
- 输入
- 若干行整数,第一行有2个数,分别为顶点数v和弧数a,接下来有a行,每一行有2个数,分别是该条弧所关联的两个顶点编号
- 输出
- 若干个空格隔开的顶点构成的序列(用小写字母)
- 样例输入
-
1234567896 81 21 31 43 23 54 56 46 5
- 样例输出
-
1v1 v3 v2 v6 v4 v5
C++实现
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 |
#include<iostream> #include<vector> #include<queue> #include<cstdio> using namespace std; int main(){ int n, m; cin>>n>>m; vector<int> vec[n + 1]; vector<int> cnt(n + 1); vector<bool> visit(n + 1); int a, b; for(int i = 0; i < m; i++){ cin>>a>>b; vec[a].push_back(b); cnt[b]++; } queue<int> q; for(int i = 1; i <= n; i++){ if(cnt[i] == 0){ q.push(i); visit[i] = true; break; } } int flag = 0; while(!q.empty()){ int cur = q.front(); q.pop(); for(int i = 0; i < vec[cur].size(); i++)cnt[vec[cur][i]]--; for(int i = 1; i <= n; i++){ if(cnt[i] == 0 && visit[i] == false){ q.push(i); visit[i] = true; break; } } printf("v%d%s", cur, ++flag == n ? "\n" : " "); } return 0; } |