给出n个准考证号和成绩:
准考证号:
第1位:考试等级
第2-4位:考场号,范围:101-999
第5-10位:日期,格式:yymmdd
第11-13位:个人编号,范围:000-999
给m个查询:
三种类型:
1:给出考试等级,得到这个考试等级的所有考生的成绩,按成绩从大到小排序输出,如果成绩相同,显示出准考证号小的。
2:给出考场号,求出该考场的人数和所有人的成绩总和
3:给出考试日期,求该日期的考场和考场人数,按人数从大到小的输出,人数相同,考场号小的先输出。
这一题主要是对字符串的处理,将它转变成数字,然后对其按排序。然后按照日期和考场,统计人数,然后按照人数和考场排序。
这一题写了好久才写出来,提交上去,第五个测试点一直是错误,以为是哪种情况没想到,看了一下别人的源码还是没看出来哪种情况。最后自己测试了一下,发现第三种情况有错误,判断没有的条件写在了循环里。改过来之后就成功通过了。
这一题看了别人的代码,才发现我写的很麻烦,短时间内可能是写不出来的。(用时:4:30:22.71)。
#include <bits/stdc++.h>
using namespace std;
struct Card {
int sit = 0;
int date=0;
int score=0;
char cardNum[14];
};
struct Number {
int Num;
int date;
int numCount = 0;
};
int GetCard(struct Card cards[],char cardnum[],int index )
{
strcpy(cards[index].cardNum, cardnum);
int i;
for( i=1; i<4; i++) {
cards[index].sit = cardnum[i]- '0' + cards[index].sit * 10;
}
for(; i<10; i++) {
cards[index].date = cardnum[i] - '0' + cards[index].date * 10;
}
int num = 0;
for(i=1; i<10; i++) {
num = cardnum[i] - '0' + num * 10;
}
return num;
}
bool cmp1(struct Card c1,struct Card c2)
{
if(c1.score > c2.score ) {
return true;
} else if(c1.score == c2.score) {
return strcmp(c1.cardNum,c2.cardNum) < 0;
}
return false;
}
bool cmp2(struct Number num1,struct Number num2)
{
if(num1.numCount > num2.numCount ) {
return true;
} else if(num1.numCount == num2.numCount) {
return num1.Num < num2.Num;
}
return false;
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
char queryStr[14];
int score = 0;
Card card[n];
Number number[n];
int num = 0;
map<int,int> keyMap;
int length = 0;
for(int i=0; i<n; i++) {
scanf("%s%d",queryStr,&score);
num = GetCard(card,queryStr,i);
card[i].score = score;
if(keyMap.count(num)==0) {
number[length].date = card[i].date;
number[length].Num = card[i].sit;
keyMap[num] = length;
number[length].numCount = 1;
length++;
} else {
number[keyMap[num]].numCount++;
}
}
sort(card,card+n,cmp1);
sort(number,number+length,cmp2);
int type;
int dateNum = 0;
int personCount = 0;
int sitNum = 0;
bool flag = true;
for(int j=0; j<m; j++) {
scanf("%d%s",&type,queryStr);
flag = false;
printf("Case %d: %d %s\n",j+1, type, queryStr);
switch(type) {
case 1:
for(int i=0; i<n; i++) {
if(card[i].cardNum[0] == queryStr[0]) {
printf("%s %d\n",card[i].cardNum,card[i].score);
flag = true;
}
}
if(!flag) {
printf("NA\n");
}
break;
case 2:
sitNum = atoi(queryStr);
personCount = 0;
score = 0;
for(int i=0; i<n; i++) {
if(card[i].sit == sitNum) {
score += card[i].score;
personCount++;
}
}
if(personCount > 0) {
printf("%d %d\n",personCount,score);
} else {
printf("NA\n");
}
break;
case 3:
dateNum = atoi( queryStr);
for(int i=0; i<length; i++) {
if(number[i].date ==dateNum ) {
printf("%d %d\n",number[i].Num,number[i].numCount);
flag = true;
}
}
if(!flag) {
printf("NA\n");
}
break;
default:
printf("NA\n");
break;
}
}
return 0;
}