It is then assumed that the user id’s are 5-digit numbers from 00001 to N
题目一定要读清楚,少走很多歪路,没读清题目导致代码思路复杂,并且还有一个测试点过不了
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct node1{
int uid;
int score;
int kind;
}stu[100001],student;
struct node2{
int uid;
int rank;
int score[6];
int res;
bool flag[6];
}extract[100001];
bool cmp1(node1 a,node1 b){
return a.uid<b.uid;
}
bool cmp2(node2 a,node2 b){
if(a.score[0]!=b.score[0])return a.score[0]>b.score[0];
else if(a.res!=b.res)return a.res>b.res;
else return a.uid<b.uid;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,k,m,ps[6]={0},kind=0; //kind记录提交-1的问题号是多少,与issubmit配合使用
bool issubmit=false; //记录之前是否有提交-1
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++)scanf("%d",&ps[i]);
for(int i=0;i<m;i++)scanf("%d%d%d",&stu[i].uid,&stu[i].kind,&stu[i].score);
sort(stu,stu+m,cmp1);
int index=0;
for(int i=0;i<m;i++){ //学生成绩整合筛选
student=stu[i];
if(student.score!=-1){
if(i==0){
extract[index].uid=student.uid;
extract[index].flag[student.kind]=true;
extract[index].score[student.kind]=student.score;
if(student.score==ps[student.kind])extract[index].res++;
extract[index].score[0]=extract[index].score[0]+student.score;
}
if(student.uid==extract[index].uid){
if(extract[index].flag[student.kind]){
if(student.score>extract[index].score[student.kind]){
extract[index].score[0]=extract[index].score[0]+student.score-extract[index].score[student.kind];
extract[index].score[student.kind]=student.score;
if(student.score==ps[student.kind])extract[index].res++;
}
}else{
extract[index].flag[student.kind]=true;
extract[index].score[student.kind]=student.score;
if(student.score==ps[student.kind])extract[index].res++;
extract[index].score[0]=extract[index].score[0]+student.score;
}
if(issubmit){
extract[index].flag[kind]=true;
issubmit=false;
}
}else{
index++;
extract[index].uid=student.uid;
extract[index].flag[student.kind]=true;
extract[index].score[student.kind]=student.score;
if(student.score==ps[student.kind])extract[index].res++;
extract[index].score[0]=extract[index].score[0]+student.score;
if(issubmit)issubmit=false;
}
}else{
if(extract[index].uid==student.uid){
extract[index].flag[student.kind]=true;
}else{
issubmit=true;
kind=student.kind;
}
}
}
sort(extract,extract+index+1,cmp2); //排序
extract[0].rank=1;
for(int i=1;i<=index;i++){ //排名
if(extract[i].score[0]!=extract[i-1].score[0])extract[i].rank=i+1;
else extract[i].rank=extract[i-1].rank;
}
for(int i=0;i<=index;i++){ //输出
printf("%d %05d %d",extract[i].rank,extract[i].uid,extract[i].score[0]);
for(int j=1;j<=k;j++){
if(extract[i].flag[j]){
printf(" %d",extract[i].score[j]);
}else{
printf(" -");
}
}
printf("\n");
}
return 0;
}
算法笔记:
1、初始化结构体flag=false,考生至少存在一个问题能通过编译,才将flag=true。score数组置为-1,当考生对应题目的分数为-1时,则将score数组对应位置置0;当考生对应题目的分数非-1时,则去较大者赋给score数组对应位置。
2、一边读入考生数据,一边修改结构体数组中的数据
3、对结构体数组排序
4、得出考生对应的排名并输出(注:只输出flag=true即有通过编译的提交的考生)
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
struct node{
bool flag;
int score[6];
int fullnum;
int id;
int total;
}stu[10001];
void init(){
for(int i=1;i<=n;i++){
stu[i].flag=false;
stu[i].id=i;
memset(stu[i].score,-1,sizeof(stu[i].score));
}
}
bool cmp(node a,node b){
if(a.total!=b.total)return a.total>b.total;
else if(a.fullnum!=b.fullnum)return a.fullnum>b.fullnum;
else return a.id<b.id;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int k,m,fscore[6],id,kind,score;
scanf("%d%d%d",&n,&k,&m);
init();
for(int i=1;i<=k;i++)scanf("%d",&fscore[i]);
for(int i=1;i<=m;i++){ //遍历每个考生提交的内容,分别整合到每个考生对应的一个结构体中
scanf("%d%d%d",&id,&kind,&score);
if(score==-1&&stu[id].score[kind]==-1){ //某题第一次编译错误,分值记为0分,自己写的时候疏忽了,没有想到(因为若不是第一次编译错误,则不能将0覆盖掉原理的分数)
stu[id].score[kind]=0;
}
if(score!=-1){
stu[id].flag=true;
}
if(score==fscore[kind]&&stu[id].score[kind]!=fscore[kind]){
stu[id].fullnum++;
}
if(score>stu[id].score[kind]){
stu[id].score[kind]=score;
}
}
for(int i=1;i<=n;i++){ //求得每个考生的总分
for(int j=1;j<=k;j++){
if(stu[i].score[j]!=-1){
stu[i].total+=stu[i].score[j];
}
}
}
sort(stu+1,stu+n+1,cmp); //注意:左闭右开
int rank=1;
for(int i=1;i<=n&&stu[i].flag==true;i++){ //计算排名并打印,跳过flag=false的考生
if(i!=1){
if(stu[i].total!=stu[i-1].total)rank=i;
}
printf("%d %05d %d",rank,stu[i].id,stu[i].total);
for(int j=1;j<=k;j++){
if(stu[i].score[j]==-1)printf(" -");
else printf(" %d",stu[i].score[j]);
}
printf("\n");
}
return 0;
}
growthmindset
发布了26 篇原创文章 · 获赞 0 · 访问量 99
私信
关注