/*
比赛(Test):查看题目 Show Problem
赛题题目:成绩单
所属比赛:第一届AC-XL杯NOIP08提高模拟赛
问题编号:378 [提交该赛题]
描述: 衡中的学生很郁闷啊!每天都要考试,考不好了还要挨批斗~~~~~
又考试了,这次考试的人数特别多,每个人的学号很特别,是用字符串表示的,(不超过30 位),可是学校负责考试的老师
请假回家了,所以这次考试没有人安排考场了。
无奈啊~~~~~~
所以m哥决定让学生在自己的座位上考试,实行诚实考试制度(没有监考老师)。衡中的学生很听话啊~~~~,每个人都没有作
弊。
但是录分、统计成了问题,学生的考试成绩放在了输入文件中。
m哥今天太累了,但是他还是很关心学生的成绩的,于是他让你把学生的成绩按学号排列(字典顺序,学号全为小写字母,从
小到大排列)(不排成绩),并统计各个分数,及分数段的人数,以及满分人员(满分要XX奖学金的,虽然一般只有几十块
-_-bbb)
【输入数据】
第一行:一个数 n (n<=130000人)
以下n行:每行两个信息,分别为学号,分数(1~150分)
输入格式: 第一行:一个数 n (n<=130000人)
以下n行:每行两个信息,分别为学号,分数(1~150分)
输出格式: 第一行 各个分数段(空格隔开)(例如 1~10 11~20 ……(见例样输出,不包括150分的人数))
第二行 各个分数段的人数(空格隔开,没有则输出0 )
接下来的n 行,分别为n个学生的学号,成绩,(空格隔开)
再接下来的一行为满分的人的人数x(如果没有则为0)(保证x不超过10000)
接下来的x行为满分人的学号(如果x为0则为一行‘No’)(按字典序从小到大排序)
每一行的每一个数据之间用空格隔开,最后一个数据后不允许有空格。
输入文件: 直接输入即可
输出文件: 直接输出即可 注意,不要在最后输出空行或空格!
样例输入: 3
bid 50
wxy 85
alc 55
样例输出: 1~9 10~19 20~29 30~39 40~49 50~59 60~69 70~79 80~89 90~99 100~109 110~119 120~129 130~139 140~149
0 0 0 0 0 2 0 0 1 0 0 0 0 0 0
alc 55
bid 50
wxy 85
0
No
*/
#include<iostream>
#include<string>
#define MAXN 130000
#define MAXFULL 10000
using namespace std;
int seg[16];
struct students{
string id;
int mark;
} stu[MAXN];
string fullmrk[MAXFULL];
int partition(int i,int j){
students pivotkey=stu[i];
while (i<j){
while(i<j&&pivotkey.id<=stu[j].id) --j;
if (i<j) stu[i++]=stu[j];
while(i<j&&pivotkey.id>=stu[i].id) ++i;
if (i<j) stu[j--]=stu[i];
}
stu[i]=pivotkey;
return i;
}
void qsort(int i,int j){
if (i>=j) return;
int key=partition(i,j);
qsort(i,key-1);
qsort(key+1,j);
}
/*
int part(int i,int j){
string pivotkey=fullmrk[i];
while (i<j){
while(i<j&&pivotkey<=fullmrk[j]) --j;
if (i<j) fullmrk[i++]=fullmrk[j];
while(i<j&&pivotkey>=fullmrk[i]) ++i;
if (i<j) fullmrk[j--]=fullmrk[i];
}
fullmrk[i]=pivotkey;
return i;
}
void quick(int i,int j){
if (i>=j) return;
int key=part(i,j);
quick(i,key-1);
quick(key+1,j);
}
*/
int main (void){
int index=0;
memset(seg,0,sizeof(seg));
int n;scanf("%d",&n);
char s[30];
for (int i=0;i<n;++i){
scanf("%s",s);
stu[i].id=s;
scanf("%d",&stu[i].mark);
if (stu[i].mark!=0)++seg[stu[i].mark/10];
}
printf("1~9 10~19 20~29 30~39 40~49 50~59 60~69 70~79 80~89 90~99 100~109 110~119 120~129 130~139 140~149\n");
for (int i=0;i<15;++i){
if (i!=0) printf(" ");
printf("%d",seg[i]);
}
printf("\n");
qsort(0,n-1);
for (int i=0;i<n;++i){
printf("%s %d\n",stu[i].id.c_str(),stu[i].mark);
if (stu[i].mark==150)
fullmrk[index++]=stu[i].id;
}
printf("%d\n",seg[15]);
if (seg[15]==0) printf("No");
else{
//quick(0,index-1);
for (int i=0;i<index;++i){
if (i!=0) printf(" ");
printf("%s",fullmrk[i].c_str());
}
}
//while(1);
return 0;
}
//God Bless
//Jesus Bless
//Athena Bless
//Venus Bless
//Ru lai Bless
//Guan Yin Bless
//Di Zang Bless
//All The Gods Will Bless
//I Bless For Every God
//I Would Like To AC
AC后:
/*
比赛(Test):查看题目 Show Problem
赛题题目:成绩单
所属比赛:第一届AC-XL杯NOIP08提高模拟赛
问题编号:378 [提交该赛题]
描述: 衡中的学生很郁闷啊!每天都要考试,考不好了还要挨批斗~~~~~
又考试了,这次考试的人数特别多,每个人的学号很特别,是用字符串表示的,(不超过30 位),可是学校负责考试的老师
请假回家了,所以这次考试没有人安排考场了。
无奈啊~~~~~~
所以m哥决定让学生在自己的座位上考试,实行诚实考试制度(没有监考老师)。衡中的学生很听话啊~~~~,每个人都没有作
弊。
但是录分、统计成了问题,学生的考试成绩放在了输入文件中。
m哥今天太累了,但是他还是很关心学生的成绩的,于是他让你把学生的成绩按学号排列(字典顺序,学号全为小写字母,从
小到大排列)(不排成绩),并统计各个分数,及分数段的人数,以及满分人员(满分要XX奖学金的,虽然一般只有几十块
-_-bbb)
【输入数据】
第一行:一个数 n (n<=130000人)
以下n行:每行两个信息,分别为学号,分数(1~150分)
输入格式: 第一行:一个数 n (n<=130000人)
以下n行:每行两个信息,分别为学号,分数(1~150分)
输出格式: 第一行 各个分数段(空格隔开)(例如 1~10 11~20 ……(见例样输出,不包括150分的人数))
第二行 各个分数段的人数(空格隔开,没有则输出0 )
接下来的n 行,分别为n个学生的学号,成绩,(空格隔开)
再接下来的一行为满分的人的人数x(如果没有则为0)(保证x不超过10000)
接下来的x行为满分人的学号(如果x为0则为一行‘No’)(按字典序从小到大排序)
每一行的每一个数据之间用空格隔开,最后一个数据后不允许有空格。
输入文件: 直接输入即可
输出文件: 直接输出即可 注意,不要在最后输出空行或空格!
样例输入: 3
bid 50
wxy 85
alc 55
样例输出: 1~9 10~19 20~29 30~39 40~49 50~59 60~69 70~79 80~89 90~99 100~109 110~119 120~129 130~139 140~149
0 0 0 0 0 2 0 0 1 0 0 0 0 0 0
alc 55
bid 50
wxy 85
0
No
*/
#include<iostream>
#include<string>
#define MAXN 130000
#define MAXFULL 10000
using namespace std;
int seg[16];
struct students{
string id;
int mark;
} stu[MAXN];
string fullmrk[MAXFULL];
int partition(int i,int j){
students pivotkey=stu[i];
while (i<j){
while(i<j&&pivotkey.id<=stu[j].id) --j;
if (i<j) stu[i++]=stu[j];
while(i<j&&pivotkey.id>=stu[i].id) ++i;
if (i<j) stu[j--]=stu[i];
}
stu[i]=pivotkey;
return i;
}
void qsort(int i,int j){
if (i>=j) return;
int key=partition(i,j);
qsort(i,key-1);
qsort(key+1,j);
}
/*
int part(int i,int j){
string pivotkey=fullmrk[i];
while (i<j){
while(i<j&&pivotkey<=fullmrk[j]) --j;
if (i<j) fullmrk[i++]=fullmrk[j];
while(i<j&&pivotkey>=fullmrk[i]) ++i;
if (i<j) fullmrk[j--]=fullmrk[i];
}
fullmrk[i]=pivotkey;
return i;
}
void quick(int i,int j){
if (i>=j) return;
int key=part(i,j);
quick(i,key-1);
quick(key+1,j);
}
*/
int main (void){
int index=0;
memset(seg,0,sizeof(seg));
int n;scanf("%d",&n);
char s[30];
for (int i=0;i<n;++i){
scanf("%s",s);
stu[i].id=s;
scanf("%d",&stu[i].mark);
if (stu[i].mark!=0)++seg[stu[i].mark/10];
}
printf("1~9 10~19 20~29 30~39 40~49 50~59 60~69 70~79 80~89 90~99 100~109 110~119 120~129 130~139 140~149\n");
for (int i=0;i<15;++i){
if (i!=0) printf(" ");
printf("%d",seg[i]);
}
printf("\n");
qsort(0,n-1);
for (int i=0;i<n;++i){
printf("%s %d\n",stu[i].id.c_str(),stu[i].mark);
if (stu[i].mark==150)
fullmrk[index++]=stu[i].id;
}
printf("%d\n",seg[15]);
if (seg[15]==0) printf("No");
else{
//quick(0,index-1);
for (int i=0;i<index;++i){
if (i!=0) printf("\n");
printf("%s",fullmrk[i].c_str());
}
}
//while(1);
return 0;
}
//God Bless
//Jesus Bless
//Athena Bless
//Venus Bless
//Ru lai Bless
//Guan Yin Bless
//Di Zang Bless
//All The Gods Will Bless
//I Bless For Every God
//I Would Like To AC
55555555555555555555555555555555555555555555555555
55555555555555555555555555555555555555555555555555
55555555555555555555555555555555555555555555555555
55555555555555555555555555555555555555555555555555
55555555555555555555555555555555555555555555555555
感觉真tm爽...
这道题让俺找到了我以前学C的时候做一个数据管理系统时候的感觉...
(话说那个一个文件就上千行代码...)
俺一开始的时候的算法
各种类型转换来转换去...
指针的指针xx的xx...
虽说只有二维...
现在想想,当时再学C++是一个非常明智的选择啊...