目录
题目描述
一天,小明坐在院子里数星星,Gardon就出了个难题给她:Gardon在天空画出了一个矩形区域,让他输入矩形区域里有多少颗星星,仁慈的上帝还为他标出了每个星星的坐标。但小明数着数着就看花了眼,但他的原则是:宁愿多数一次,不可错过一个。如果小明把他数过的星星的坐标都告诉你,你能否帮他进行排重处理(如果两个星星的坐标位置相同,则视为一个星星),计算出星星的个数。
输入
首先输入一个整数n(n<=300),接下来的n对整数,每对表示小明数过的一个星星的位置(星星的坐标在-10000到10000之间)。
输出
输出星星的个数。
样例输入 Copy
- 5
- 0 3
- 1 5
- 1 1
- 0 1
- 1 5
样例输出 Copy
4
源代码
- #include
- #include
- #include
- using namespace std;
- struct Point
- {
- int x;
- int y;
- };
- Point S[550];
- int cmp(const struct Point &A,const struct Point &B)
- {
- if(A.x != B.x)return A.x < B.x;
- else return A.y < B.y;
-
- }
- int main()
- {
- int n;
- cin >> n;
- for(int i = 1;i <= n;i ++ )cin >> S[i].x >> S[i].y;
- sort(S + 1,S + 1 + n,cmp);
- int ans = 0;
- for(int i = 1;i <= n;i ++ )
- {
- if(S[i].x == S[i + 1].x && S[i].y == S[i + 1].y && i + 1 <= n)continue;
- else ans ++ ;
- }
- cout << ans << endl;
- return 0;
- }
题目描述
某校发放奖学金共5种,获取条件各不同:
1.阳明奖学金,每人8000,期末平均成绩>80,且在本学期发表论文大于等于1篇;
2.梨洲奖学金,每人4000,期末平均成绩>85,且班级评议成绩>80;
3.成绩优秀奖,每人2000,期末平均成绩>90;
4.西部奖学金,每人1000,期末平均成绩>85的西部省份学生;
5.班级贡献奖,每人850,班级评议成绩>80的学生干部。
只要符合条件就可以得奖,一人可兼得多项奖学金。例:某生,期末平均成绩87,班级评议成绩82,且是学生干部,则可同时获得梨洲奖学金和班级贡献奖,奖金总数4850。现给出若干学生的姓名、期末平均成绩、班级评议成绩、是否学生干部、是否西部省份学生、发表论文数。计算哪个同学获得的奖金总数最高?有多个最高值则输出第一个出现的。
输入
第一行是一个整数n(1 <= n <= 10),表示学生的总数。接下来的n行,每行是一位学生的数据,从左向右依次是姓名,期末平均成绩,班级评议成绩,是否是学生干部,是否是西部省份学生,以及发表的论文数。姓名是由大小写英文字母组成的长度不超过20的字符串(不含空格);期末平均成绩和班级评议成绩都是0到100之间的整数(包括0和100);是否是学生干部和是否是西部省份学生分别用一个字符表示,Y表示是,N表示不是;发表的论文数是0到10的整数(包括0和10)。每两个相邻数据项之间用一个空格分隔。
输出
输出包括三行,第一行是获得最多奖金的学生的姓名,第二行是这名学生获得的奖金总数。如果有两位或两位以上的学生获得的奖金最多,输出他们之中在输入文件中出现最早的学生的姓名。第三行是这n个学生获得的奖学金的总数。
样例输入 Copy
- >4
- YaoLin 87 82 Y N 0
- ChenRuiyi 88 78 N Y 1
- LiXin 92 88 N N 0
- ZhangQin 83 87 Y N 1
样例输出 Copy
- ChenRuiyi
- 9000
- 28700
源代码
- #include
- #include
- using namespace std;
- const int N = 100;
- struct Student
- {
- string name;
- int avs;
- int avc;
- string bone;
- string western;
- int num;
- int sum = 0;
- };
- Student stu[N];
- int cmp(const struct Student &A,const struct Student &B)
- {
- return A.sum > B.sum;
- }
- int main()
- {
- int n,sum = 0;
- cin >> n;
- for(int i = 1;i <= n;i ++ )
- {
- cin >> stu[i].name >> stu[i].avs >> stu[i].avc >> stu[i].bone >> stu[i].western >> stu[i].num;
- if(stu[i].avs > 80 && stu[i].num >= 1)stu[i].sum += 8000;
- if(stu[i].avs > 85 && stu[i].avc > 80)stu[i].sum += 4000;
- if(stu[i].avs > 90)stu[i].sum += 2000;
- if(stu[i].avs > 85 && stu[i].western == "Y")stu[i].sum += 1000;
- if(stu[i].avc > 80 && stu[i].bone == "Y")stu[i].sum += 850;
- sum += stu[i].sum;
- }
- sort(stu + 1,stu + 1 + n,cmp);
- cout << stu[1].name << endl << stu[1].sum << endl << sum << endl;
- return 0;
- }
题目描述
有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<=i<=3),则按第i门课成绩降序输出成绩表。
输入
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。
输出
输出按第i门课降序排序的结果,格式见样例。
样例输入 Copy
- 3
- 541207010188 Zhangling 89 78 95
- 541207010189 Wangli 85 87 99
- 541207010190 Fangfang 85 68 76
- 1
样例输出 Copy
- 541207010188 Zhangling 89 78 95
- 541207010189 Wangli 85 87 99
- 541207010190 Fangfang 85 68 76
源代码
- #include
- #include
- using namespace std;
- const int N = 250;
- struct Student
- {
- string num;
- string name;
- int a,b,c;
- };
- Student stu[N];
- int cmp1(const struct Student &A,const struct Student &B)
- {
- if(A.a != B.a)return A.a > B.a;
- else return A.num < B.num;
- }
- int cmp2(const struct Student &A,const struct Student &B)
- {
- if(A.b != B.b)return A.b > B.b;
- else return A.num < B.num;
- }
- int cmp3(const struct Student &A,const struct Student &B)
- {
- if(A.c != B.c)return A.c > B.c;
- else return A.num < B.num;
- }
- int main()
- {
- int n;
- cin >> n;
- for(int i = 1;i <= n;i ++ )cin >> stu[i].num >> stu[i].name >> stu[i].a >> stu[i].b >> stu[i].c;
- int num;
- cin >> num;
- if(num == 1)sort(stu + 1,stu + 1 + n,cmp1);
- else if(num == 2)sort(stu + 1,stu + 1 + n,cmp2);
- else if(num == 3)sort(stu + 1,stu + 1 + n,cmp3);
- for(int i = 1;i <= n;i ++ )cout << stu[i].num << ' ' << stu[i].name << ' ' << stu[i].a << ' ' << stu[i].b << ' ' << stu[i].c << endl;
- return 0;
- }
题目描述
有一学生成绩表,包括学号、姓名、3门课程成绩。请按如下规则排序:按总成绩降序排序,若总成绩相同,则按姓名升序排序。
输入
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
输出
输出排序后的成绩单,格式见输出样例。
样例输入 Copy
- 3
- 541207010188 Zhangling 89 78 95
- 541207010189 Wangli 85 87 99
- 541207010190 Fangfang 89 88 85
样例输出 Copy
- 541207010189 Wangli 85 87 99 271
- 541207010190 Fangfang 89 88 85 262
- 541207010188 Zhangling 89 78 95 262
源代码
- #include
- #include
- using namespace std;
- const int N = 1000 + 10;
- struct Student
- {
- string num;
- string name;
- int a,b,c,sum;
- };
- Student stu[N];
- int main()
- {
- int n;
- cin >> n;
- for(int i = 1;i <= n;i ++ )
- {
- cin >> stu[i].num >> stu[i].name >> stu[i].a >> stu[i].b >> stu[i].c;
- stu[i].sum = stu[i].a + stu[i].b + stu[i].c;
- }
- for(int i = 1;i <= n;i ++ )
- {
- for(int j = i + 1;j <= n;j ++ )
- {
- if(stu[i].sum < stu[j].sum)
- {
- Student t;
- t = stu[i];
- stu[i] = stu[j];
- stu[j] = t;
- }
- }
- }
- for(int i = 1;i <= n;i ++ )
- {
- for(int j = i + 1;j <= n;j ++ )
- {
- if(stu[i].sum == stu[j].sum && stu[i].name > stu[j].name)
- {
- Student t;
- t = stu[i];
- stu[i] = stu[j];
- stu[j] = t;
- }
- }
- }
- for(int i = 1;i <= n;i ++ )cout << stu[i].num << ' ' << stu[i].name << ' ' << stu[i].a << ' ' <
' ' << stu[i].c << ' ' << stu[i].sum << endl; - return 0;
- }
题目描述
n只猴子围坐成一个圈,按顺时针方向从1到n编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到m的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。
输入
输入两个整数n和m,1<=m<=n<=100。
输出
输出猴王的编号
样例输入 Copy
8 3
样例输出 Copy
7
源代码
- //由于数据结构大二才学链表的形式
- //也就是题目要求的由c语言编写的单链表
- //所以暂时利用数组来模拟单链表的实现
- //将链表的尾指向链表的头形成一个循环链表遍历即可
- #include
- using namespace std;
- const int N = 1000000 + 10;
- int e[N],ne[N],head,idx;
- void init()
- {
- head = -1;
- idx = 0;
- }
- void insert(int k,int x)
- {
- e[idx] = x;
- ne[idx] = ne[k];
- ne[k] = idx ++ ;
- }
- void add_to_head(int x)
- {
- e[idx] = x;
- ne[idx] = head;
- head = idx ++ ;
- }
- void remove(int k)
- {
- ne[k] = ne[ne[k]];
- }
- int n,m,res,o = 0;
- int main()
- {
- cin >> n >> m;
- res = n;
- for(int i = 1;i <= n;i ++ )
- {
- if(i == 1)add_to_head(i);
- else insert(idx - 1,i);
- }
- ne[idx - 1] = head;
- for(int i = head;res != 1;i = ne[i])
- {
- if(e[i] != 0)o ++ ;
- if(o == m && e[i] != 0)
- {
- e[i] = 0;
- o = 0;
- res -- ;
- }
- }
- for(int i = head;;i = ne[i])
- {
- if(e[i] != 0)
- {
- cout << e[i];
- break;
- }
- }
- return 0;
- }
题目描述
一天,小明坐在院子里数星星,Gardon就出了个难题给他,让他数数天上的星星最多有多少个是在同一条直线上的。天上的星星太多了,小明马上就看花了眼,你能写个程序来帮他计算么?
输入
首先输入一个整数N(N<=300),接下来的N对数每对表示一个星星的位置(星星的坐标在-10000到10000之间,精确到小数点后1位)。没有两个星星会在同一个位置。
输出
一个整数,表示一条直线上最多星星的数目。
样例输入 Copy
- 5
- 0 0
- 1 0
- 1 1
- 0 1
- 0.5 0.5
样例输出 Copy
3
源代码
- #include
- #include
- using namespace std;
- //存储星星坐标
- struct Point
- {
- double x;
- double y;
- };
- //建立动态数组
- vector
A; - int main()
- {
- int n;
- cin >> n;
- //读取星星坐标并存入
- while(n -- )
- {
- Point t;
- cin >> t.x >> t.y;
- A.push_back(t);
- }
- //根据两点一线原则,只要星星个数大于2,无论坐标(无重复)如何一定有两解
- int ans = 2;
- //两重循环对于所有点的情况的斜率进行遍历
- for(int i = 0;i < A.size() - 1;i ++ )
- {
- for(int j = i + 1;j < A.size();j ++ )
- {
- //斜率状况,1为斜线(k不为0),2为直线(k为0)
- int flag;
- //记录本种斜率的答案个数
- int num = 2;
- //两点在一条直线
- if(A[i].x == A[j].x)flag = 0;
- //两点在一条斜线
- else flag = 1;
- //斜线状况
- if(flag == 1)
- {
- //计算当前两点斜率
- double k = (A[j].y - A[i].y) * 1.0 / (A[j].x - A[i].x);
- //遍历数组求取斜率相等的点的个数
- for(int t = 0;t < A.size();t ++ )
- {
- //遇见端点跳过即可,num默认为2
- if(t == i || t == j)continue;
- //数学公式为k = (y1 - y0) / (x1 - x0),考虑到斜率为浮点数的情况还要类型转换,所以变形为y1 - y0 = k(x1 - x0)
- if((A[t].y - A[i].y) == (A[t].x - A[i].x) * k)num ++ ;
- }
- }
- //当前直线状况
- else if(flag == 0)
- {
- //遍历数组求取斜率相等的点的个数,位于当前直线即可求解
- for(int t = 0;t < A.size();t ++ )
- {
- //遇见端点跳过即可,num默认为2
- if(t == i || t == j)continue;
- if(A[t].x == A[i].x)num ++ ;
- }
- }
- //ans求取最大值
- ans = max(ans,num);
- }
- }
- cout << ans << endl;
- return 0;
- }
题目描述
今天浙大研究生复试的上机考试跟传统笔试的打分规则相似,总共有n道题,每道题有对应分值,最后计算总成绩。现给定录取分数线,请你写程序找出最后通过分数线的考生,并将他们的成绩按降序打印。
输入
第1行给出考生人数N ( 1<= N<=100 )、考题数M (1<=M<=10 )、分数线(正整数)G;
第2行排序给出第1题至第M题的正整数分值;
以下N行,每行给出一名考生的准考证号(长度不超过20的字符串)、该生解决的题目总数m、以及这m道题的题号
(题目号由1到M)。
输出
首先在第1行输出不低于分数线的考生人数n,随后n行按分数从高到低输出上线考生的考号与分数,其间用1空格分隔。若有多名考生分数相同,则按他们考号的升序输出。
样例输入 Copy
- 4 5 25
- 10 10 12 13 15
- CS004 3 5 1 3
- CS003 5 2 4 1 3 5
- CS002 2 1 2
- CS001 3 2 3 5
样例输出 Copy
- 3
- CS003 60
- CS001 37
- CS004 37
源代码
- #include
- #include
- using namespace std;
- const int N = 250;
- struct Student
- {
- string num;
- int sum;
- };
- int score[N];
- Student stu[N];
- int cmp(const struct Student &A,const struct Student &B)
- {
- if(A.sum != B.sum)return A.sum > B.sum;
- else return A.num < B.num;
- }
- int main()
- {
- int n,m,g,num = 0;
- cin >> n >> m >> g;
- for(int i = 1;i <= m;i ++ )cin >> score[i];
- for(int i = 1;i <= n;i ++ )
- {
- cin >> stu[i].num;
- int t;
- cin >> t;
- while(t -- )
- {
- int idx;
- cin >> idx;
- stu[i].sum += score[idx];
- }
- if(stu[i].sum >= g)num ++ ;
- }
- cout << num << endl;
- sort(stu + 1,stu + 1 +n,cmp);
- for(int i = 1;i <= n;i ++ )if(stu[i].sum >= g)cout << stu[i].num << ' ' << stu[i].sum << endl;
- return 0;
- }
题目描述
输入
输出
样例输入 Copy
- 8
- Smith -1 -16 8 0 0 120 39 0
- John 116 -2 11 0 0 82 55(-1) 0
- Josephus 72(-3) 126 10 -3 0 47 21(-2) -2
- Bush 0 -1 -8 0 0 0 0 0
- Alice -2 67(-2) 13 -1 0 133 79(-1) -1
- Bob 0 0 57(-5) 0 0 168 -7 0
样例输出 Copy
- Josephus 5 376
- John 4 284
- Alice 4 352
- Smith 3 167
- Bob 2 325
- Bush 0 0
提示
源代码
- #include
- #include
- #include
- #include
- using namespace std;
- struct Student
- {
- string name;
- string problem[500];
- int sumS;
- int sumT;
- };
- Student stu[500];
- int cmp(const struct Student &A,const struct Student &B)
- {
- if(A.sumS != B.sumS)return A.sumS > B.sumS;
- else if(A.sumT != B.sumT)return A.sumT < B.sumT;
- else if(A.name != B.name)return A.name < B.name;
- }
- int transT(string s)
- {
- if(s.find("(") == -1 && s.find(")") == -1 && s.find("-") != -1)return 0;
- int tail = s.find("(");
- if(tail == -1)tail = s.size();
- if(tail == 0)return 0;
- int ans = 0;
- for(int i = 0;i < tail;i ++ )ans = ans * 10 + (s[i] - '0');
- if(s.find("(") != -1)
- {
- int l = s.find("-") + 1;
- int r = s.find(")") - 1;
- int extra = 0;
- for(int i = l;i <= r;i ++ )extra = extra * 10 + (s[i] - '0');
- ans += extra * 20;
- }
- return ans;
- }
- int main()
- {
- int n;
- cin >> n;
- int idx = 1;
- while(cin >> stu[idx].name)
- {
- stu[idx].sumS = 0;
- stu[idx].sumT = 0;
- int i = idx;
- for(int j = 1;j <= n;j ++ )
- {
- cin >> stu[i].problem[j];
- if(transT(stu[i].problem[j]) != 0)
- {
- stu[i].sumS ++ ;
- stu[i].sumT += transT(stu[i].problem[j]);
- }
- }
- idx ++ ;
- }
- sort(stu + 1,stu + idx,cmp);
- for(int i = 1;i < idx;i ++ )
- {
- cout << std::left << setw(10) << stu[i].name << ' ' << std::right <<setw(2) << stu[i].sumS << ' ' << std::right <<setw(4) << stu[i].sumT << endl;
- }
- return 0;
- }
题目描述
LittleTom开发了一个在线判题系统,判题系统需要把用户提交上来的代码编译成可执行文件,然后运行。而用户会提交什么样的代码是无法预知的,所以LittleTom做了充分的准备,比如阻止解题程序访问文件系统、阻止解题程序访问注册表、阻止解题程序修改系统设置、阻止解题程序关闭系统、阻止解题程序超限或非法使用内存、阻止解题程序的运行时间超过设定时间等。这些工作LitteTom都已完成。
还有一个待解决的问题是判断解题程序的正确性。判题系统需要把解题程序产生的输出文件和正确的输出文件进行比较,如果两个文件完全相同,则判题系统返回“Accepted”,否则,如果两个文件除了空白符(空格' ', 制表符'\t', 或 回车符'\n')之外其余内容都相同,则判题系统返回“Presentation Error”,否则判题系统返回“Wrong Answer”。
给定两个文件,一个代表正确输出,一个代表用户的解题程序的输出,你的任务是计算判题系统应该返回什么信息。
输入
输入包含多组测试实例。第一行输入一个整数T表示测试实例的个数。然后是T组输入。每组输入有两部分:一个代表正确输出,一个代表用户的解题程序的输出。都以“START”开始,以“END”结束,在“START”和“END”之间的是需要判断的数据部分。
输出
对于每一个测试实例,有一行输出,输出判题系统应该返回的结果:Accepted、Presentation Error或Wrong Answer。
样例输入 Copy
4 START 1 + 2 = 3 END START 1+2=3 END START 1 + 2 = 3 END START 1 + 2 = 3 END START 1 + 2 = 3 END START 1 + 2 = 4 END START 1 + 2 = 3 END START 1 + 2 = 3 END
样例输出 Copy
Presentation Error Accepted Wrong Answer Presentation Error
源代码
- #include
- #include
- using namespace std;
- const int N = 10000;
- int judge(char c)
- {
- if(c == ' ' || c == '\n' || c == '\t')return 1;
- else return 0;
- }
- int mode(char * ans,char * text)
- {
- if(strcmp(ans,text) == 0)return 1;
- char a[N],b[N];
- for(int i = 0,j = 0;ans[i] != '\0';i ++ )
- {
- if(!judge(ans[i]))a[j ++ ] = ans[i];
- }
- for(int i = 0,j = 0;text[i] != '\0';i ++ )
- {
- if(!judge(text[i]))b[j ++ ] = text[i];
- }
- if(strcmp(a,b) == 0)return 2;
- else return 3;
- }
- void input(char * s)
- {
- while(1)
- {
- char t[N] = {0};
- cin.getline(t,10000);
- if(strcmp(t,"START") == 0)continue;
- if(strcmp(t,"END") == 0)break;
- if(t[0] == 0)strcat(s,"\n");
- else strcat(s,t);
- }
- }
- int main()
- {
- int t;
- scanf("%d",&t);
- getchar();
- while(t -- )
- {
- char ans[N];
- char text[N];
- memset(ans, 0, sizeof(ans));
- memset(text, 0, sizeof(text));
- input(ans);
- input(text);
- int flag = mode(ans,text);
- if(flag == 1)cout << "Accepted" << endl;
- else if(flag == 2)cout << "Presentation Error" << endl;
- else if(flag == 3)cout << "Wrong Answer" << endl;
- }
- return 0;
- }