PAT A1025排序题

发布于:2024-05-24 ⋅ 阅读:(150) ⋅ 点赞:(0)

初稿

总是部分错误,不知为何。

#include <stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct student{
    char id[15];
    int score;
    int loc;
 
    int loc_rank;
    int fin_rank;
    student(){}
    student(    char _id[15],
    int score1,
    int _loc){
	  strcpy(id,_id);//直接复制会出错。我选用字符串复制 
    score=score1;
     loc=_loc;}


    
}stu;//定义在外面里面?
bool cmp(student a,student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.id,b.id)<0;
}

int main(){
    int N,K,num=0;//靠点数
    int Klist[N];
    scanf("%d",&N);
    student stu2d[N][300]; 
    student stu1d[N*300];
    char id2[15];
    int score2;
    int loc2;    
    for(int i=0;i<N;i++)
    {
        scanf("%d",&K);
        Klist[i]=K;
        for(int j=0;j<K;j++)
        {
//            scanf("%s",id2);
//            scanf("%d",&score2);//不加&报错 
//            stu2d[i][j]=student(id2,score2,i+1);
            stu1d[num++]=student(id2,score2,i+1);
//直接赋值
scanf("%s %d",&stu2d[i][j].id,&stu2d[i][j].score); 
stu2d[i][j].loc=i+1;
//stu2d[i][j]=stu1d[num++];
            stu1d[num++]=stu2d[i][j]; 
        }
        sort(stu2d[i],stu2d[i]+K,cmp);
    }
    
//制作排名

//stu1d[0]=stu2d[0][0];num++;
int st=0;
for (int i=0;i<N;i++)
{
	stu2d[i][0].loc_rank=1;
	

	for (int j=0;j<Klist[i];j++)
	{
		if(j>0)
		{
		if( stu2d[i][j].score!=stu2d[i][j-1].score)
		stu2d[i][j].loc_rank=j+1;
		else
		stu2d[i][j].loc_rank=stu2d[i][j-1].loc_rank;
		}
		stu1d[num++]=stu2d[i][j];

//		printf("%s %d %d!!",stu2d[i][j].id,stu2d[i][j].score,stu2d[i][j].loc_rank);
	}
}
sort(stu1d,stu1d+num+1,cmp);
printf("%d\n",num);
stu1d[0].fin_rank=1;
printf("%s %d %d %d\n",stu1d[0].id,stu1d[0].fin_rank,stu1d[0].loc,stu1d[0].loc_rank);

	for (int i=1;i<num;i++ ) 
	{
		if (stu1d[i].score!=stu1d[i-1].score)
		stu1d[i].fin_rank=i+1;
		else
		stu1d[i].fin_rank=stu1d[i-1].fin_rank;
		printf("%s %d %d %d\n",stu1d[i].id,stu1d[i].fin_rank,stu1d[i].loc,stu1d[i].loc_rank);
	}
	

}



不管怎样,总归思想差点,循环太多了,还用了两个数组。 

修改了思想,

赋值时直接付给结构体,

只用一个一维数组,先分组排序,得到排名保存,再整体排序,得到整体排名输出。

还是部分正确

#include <stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct student{
    char id[15];
    int score;
    int loc;
 
    int loc_rank;
    int fin_rank;
    student(){}
    student(    char _id[15],
    int score1,
    int _loc){
	  strcpy(id,_id);//直接复制会出错。我选用字符串复制 
    score=score1;
     loc=_loc;}


    
}stu;//定义在外面里面?
bool cmp(student a,student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.id,b.id)<0;
}

int main(){
//	printf("%d %d","123"<"124",strcmp("123","124")<0); 
    int N,K,num=0;//靠点数
    int Klist[N];
    scanf("%d",&N);
    student stu2d[N][300]; 
    student stu1d[N*300];
    char id2[15];
    int score2;
    int loc2;    
    for(int i=0;i<N;i++)
    {
        scanf("%d",&K);
        Klist[i]=K;
        for(int j=0;j<K;j++)
        {
//            scanf("%s",id2);
//            scanf("%d",&score2);//不加&报错 
//            stu2d[i][j]=student(id2,score2,i+1);
            stu1d[num++]=student(id2,score2,i+1);
//直接赋值
//scanf("%s %d",&stu2d[i][j].id,&stu2d[i][j].score); 
//stu2d[i][j].loc=i+1;
scanf("%s %d",&stu1d[num].id,&stu1d[num].score); 
stu1d[num++].loc=i+1;
//stu2d[i][j]=stu1d[num++];
//            stu1d[num++]=stu2d[i][j]; 
        }
        sort(stu1d+num-K,stu1d+num,cmp);
        stu1d[num-K].loc_rank=1;
        for (int l=1;l<K;l++)
        {
        	if (stu1d[num-K+l].score!=stu1d[num-K+l-1].score) stu1d[num-K+l].loc_rank=l+1;
        	else stu1d[num-K+l].loc_rank=stu1d[num-K+l-1].loc_rank;
		}
    }
sort(stu1d,stu1d+num,cmp);
stu1d[0].fin_rank=1;
        for (int l=1;l<num;l++)
        {
        	if (stu1d[l].score!=stu1d[l-1].score) stu1d[l].fin_rank=l+1;
        	else stu1d[l].fin_rank=stu1d[l].fin_rank;
		}
    
   
//制作排名

//stu1d[0]=stu2d[0][0];num++;
//int st=0;
//for (int i=0;i<N;i++)
//{
//	stu2d[i][0].loc_rank=1;
//	
//
//	for (int j=0;j<Klist[i];j++)
//	{
//		if(j>0)
//		{
//		if( stu2d[i][j].score!=stu2d[i][j-1].score)
//		stu2d[i][j].loc_rank=j+1;
//		else
//		stu2d[i][j].loc_rank=stu2d[i][j-1].loc_rank;
//		}
//		stu1d[num++]=stu2d[i][j];
//
		printf("%s %d %d!!",stu2d[i][j].id,stu2d[i][j].score,stu2d[i][j].loc_rank);
//	}

sort(stu1d,stu1d+num+1,cmp);
printf("%d\n",num);
stu1d[0].fin_rank=1;
printf("%s %d %d %d\n",stu1d[0].id,stu1d[0].fin_rank,stu1d[0].loc,stu1d[0].loc_rank);

	for (int i=1;i<num;i++ ) 
	{
		if (stu1d[i].score!=stu1d[i-1].score)
		stu1d[i].fin_rank=i+1;
		else
		stu1d[i].fin_rank=stu1d[i-1].fin_rank;
		printf("%s %d %d %d\n",stu1d[i].id,stu1d[i].fin_rank,stu1d[i].loc,stu1d[i].loc_rank);
	}
	

}



最终鞥新:就我上面这个代码,去掉sort(stu,stu+num+1,cmp)就好了!艹,多走一百年弯路。

stu  ->  stu[30010]结果不变

这样过了

#include <cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct student{
    char id[15];
    int score;
    int loc;
 
    int loc_rank;
    int fin_rank;


    
}stu[30010];//定义在外面里面?
bool cmp(student a,student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.id,b.id)<0;
}

int main(){
    int N,K,num=0;//靠点数
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d",&K);
        for(int j=0;j<K;j++)
        {
scanf("%s %d",stu[num].id,&stu[num].score); 
stu[num++].loc=i+1;
        }
        sort(stu+num-K,stu+num,cmp);
        stu[num-K].loc_rank=1;
        for (int j=num-K+1;j<num;j++)
        {
        	if (stu[j].score!=stu[j-1].score) stu[j].loc_rank=j+1-(num-K);
        	else stu[j].loc_rank=stu[j-1].loc_rank;
		}
    }
printf("%d\n",num);
sort(stu,stu+num,cmp);

//制作排名
int r=1;
for(int i=0;i<num;i++)
{
	if(i>0&&stu[i].score!=stu[i-1].score)
	{
		r=i+1;
	}
printf("%s ",stu[i].id);
printf("%d %d %d\n",r,stu[i].loc,stu[i].loc_rank);
}

}









这也是25

#include <cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct student{
    char id[15];
    int score;
    int loc;
 
    int loc_rank;
    int fin_rank;


    
}stu[30010];//定义在外面里面?
bool cmp(student a,student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.id,b.id)<0;
}

int main(){
    int N,K,num=0;//靠点数
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d",&K);
        for(int j=0;j<K;j++)
        {
scanf("%s %d",stu[num].id,&stu[num].score); 
stu[num++].loc=i+1;
        }
        sort(stu+num-K,stu+num,cmp);
        stu[num-K].loc_rank=1;
        for (int j=num-K+1;j<num;j++)
        {
        	if (stu[j].score!=stu[j-1].score) stu[j].loc_rank=j+1-(num-K);
        	else stu[j].loc_rank=stu[j-1].loc_rank;
		}
    }
printf("%d\n",num);
sort(stu,stu+num,cmp);

//制作排名
int r=1;
stu[0].fin_rank=1;


stu[0].fin_rank=1;
printf("%s %d %d %d\n",stu[0].id,stu[0].fin_rank,stu[0].loc,stu[0].loc_rank);

	for (int i=1;i<num;i++ ) 
	{
		if (stu[i].score!=stu[i-1].score)
		stu[i].fin_rank=i+1;
		else
		stu[i].fin_rank=stu[i-1].fin_rank;
		printf("%s %d %d %d\n",stu[i].id,stu[i].fin_rank,stu[i].loc,stu[i].loc_rank);
	}
// for(int i=0;i<num;i++)
// {
// 	if(i>0&&stu[i].score!=stu[i-1].score)
	
// 		stu[i].fin_rank=i+1;
	
//  if(i>0&&stu[i].score==stu[i-1].score) stu[i].fin_rank=stu[i-1].fin_rank;
 
// printf("%s %d %d %d\n",stu[i].id,stu[i].fin_rank,stu[i].loc,stu[i].loc_rank);
// }
}










这个有只有19

#include <stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct student{
    char id[15];
    int score;
    int loc;
 
    int loc_rank;
    int fin_rank;
    student(){}
    student(    char _id[15],
    int score1,
    int _loc){
	  strcpy(id,_id);//直接复制会出错。我选用字符串复制 
    score=score1;
     loc=_loc;}


    
}stu[30010];//定义在外面里面?
bool cmp(student a,student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.id,b.id)<0;
}

int main(){
//	printf("%d %d","123"<"124",strcmp("123","124")<0); 
    int N,K,num=0;//靠点数
//    int Klist[N];
    scanf("%d",&N);
//    student stu2d[N][300]; 
//    student stu[N*300];
//    char id2[15];
//    int score2;
//    int loc2;    
    for(int i=0;i<N;i++)
    {
        scanf("%d",&K);
  //      Klist[i]=K;
        for(int j=0;j<K;j++)
        {
//            scanf("%s",id2);
//            scanf("%d",&score2);//不加&报错 
//            stu2d[i][j]=student(id2,score2,i+1);
            stu[num++]=student(id2,score2,i+1);
//直接赋值
//scanf("%s %d",&stu2d[i][j].id,&stu2d[i][j].score); 
//stu2d[i][j].loc=i+1;
scanf("%s %d",stu[num].id,&stu[num].score); 
stu[num++].loc=i+1;
//stu2d[i][j]=stu[num++];
//            stu[num++]=stu2d[i][j]; 
        }
        sort(stu+num-K,stu+num,cmp);
        stu[num-K].loc_rank=1;
        for (int l=1;l<K;l++)
        {
        	if (stu[num-K+l].score!=stu[num-K+l-1].score) stu[num-K+l].loc_rank=l+1;
        	else stu[num-K+l].loc_rank=stu[num-K+l-1].loc_rank;
		}
    }
printf("%d\n",num);
sort(stu,stu+num,cmp);
//stu[0].fin_rank=1;
//        for (int l=1;l<num;l++)
//        {
//        	if (stu[l].score!=stu[l-1].score) stu[l].fin_rank=l+1;
//        	else stu[l].fin_rank=stu[l].fin_rank;
//		}
//    
   
//制作排名

//stu[0]=stu2d[0][0];num++;
//int st=0;
//for (int i=0;i<N;i++)
//{
//	stu2d[i][0].loc_rank=1;
//	
//
//	for (int j=0;j<Klist[i];j++)
//	{
//		if(j>0)
//		{
//		if( stu2d[i][j].score!=stu2d[i][j-1].score)
//		stu2d[i][j].loc_rank=j+1;
//		else
//		stu2d[i][j].loc_rank=stu2d[i][j-1].loc_rank;
//		}
//		stu[num++]=stu2d[i][j];
//
		printf("%s %d %d!!",stu2d[i][j].id,stu2d[i][j].score,stu2d[i][j].loc_rank);
//	}

sort(stu,stu+num+1,cmp);
stu[0].fin_rank=1;
printf("%s %d %d %d\n",stu[0].id,stu[0].fin_rank,stu[0].loc,stu[0].loc_rank);

	for (int i=1;i<num;i++ ) 
	{
		if (stu[i].score!=stu[i-1].score)
		stu[i].fin_rank=i+1;
		else
		stu[i].fin_rank=stu[i-1].fin_rank;
		printf("%s %d %d %d\n",stu[i].id,stu[i].fin_rank,stu[i].loc,stu[i].loc_rank);
	}
	

}



这个有对了

#include <cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct student{
    char id[15];
    int score;
    int loc;
 
    int loc_rank;
    int fin_rank;


    
}stu[30010];
bool cmp(student a,student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.id,b.id)<0;
}

int main(){
    int N,K,num=0;//靠点数
    scanf("%d",&N);
 
    for(int i=0;i<N;i++)
    {
        scanf("%d",&K);
        for(int j=0;j<K;j++)
        {

scanf("%s %d",stu[num].id,&stu[num].score); 
stu[num++].loc=i+1;
        }
        sort(stu+num-K,stu+num,cmp);
        stu[num-K].loc_rank=1;
        for (int j=num-K+1;j<num;j++)
        {
        	if (stu[j].score!=stu[j-1].score) stu[j].loc_rank=j+1-(num-K);
        	else stu[j].loc_rank=stu[j-1].loc_rank;
		}
    }
printf("%d\n",num);
sort(stu,stu+num,cmp);
    
   
//制作排名
int r=1;
stu[0].fin_rank=1;


// stu[0].fin_rank=1;
// printf("%s %d %d %d\n",stu[0].id,stu[0].fin_rank,stu[0].loc,stu[0].loc_rank);

// 	for (int i=1;i<num;i++ ) 
// 	{
// 		if (stu[i].score!=stu[i-1].score)
// 		stu[i].fin_rank=i+1;
// 		else
// 		stu[i].fin_rank=stu[i-1].fin_rank;
// 		printf("%s %d %d %d\n",stu[i].id,stu[i].fin_rank,stu[i].loc,stu[i].loc_rank);
// 	}


 sort(stu,stu+num+1,cmp);
stu[0].fin_rank=1;
printf("%s %d %d %d\n",stu[0].id,stu[0].fin_rank,stu[0].loc,stu[0].loc_rank);

	for (int i=1;i<num;i++ ) 
	{
		if (stu[i].score!=stu[i-1].score)
		stu[i].fin_rank=i+1;
		else
		stu[i].fin_rank=stu[i-1].fin_rank;
		printf("%s %d %d %d\n",stu[i].id,stu[i].fin_rank,stu[i].loc,stu[i].loc_rank);
	}
	

}



 艹,多了一句话

sort(stu,stu+num+1,cmp

#include <stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct student{
    char id[15];
    int score;
    int loc;
 
    int loc_rank;
    int fin_rank;
    student(){}
    student(    char _id[15],
    int score1,
    int _loc){
	  strcpy(id,_id);//直接复制会出错。我选用字符串复制 
    score=score1;
     loc=_loc;}


    
}stu;//定义在外面里面?
bool cmp(student a,student b)
{
    if(a.score!=b.score) return a.score>b.score;
    else return strcmp(a.id,b.id)<0;
}

int main(){
//	printf("%d %d","123"<"124",strcmp("123","124")<0); 
    int N,K,num=0;//靠点数
//    int Klist[N];
    scanf("%d",&N);
//    student stu2d[N][300]; 
    student stu1d[N*300];
//    char id2[15];
//    int score2;
//    int loc2;    
    for(int i=0;i<N;i++)
    {
        scanf("%d",&K);
  //      Klist[i]=K;
        for(int j=0;j<K;j++)
        {
//            scanf("%s",id2);
//            scanf("%d",&score2);//不加&报错 
//            stu2d[i][j]=student(id2,score2,i+1);
            stu1d[num++]=student(id2,score2,i+1);
//直接赋值
//scanf("%s %d",&stu2d[i][j].id,&stu2d[i][j].score); 
//stu2d[i][j].loc=i+1;
scanf("%s %d",stu1d[num].id,&stu1d[num].score); 
stu1d[num++].loc=i+1;
//stu2d[i][j]=stu1d[num++];
//            stu1d[num++]=stu2d[i][j]; 
        }
        sort(stu1d+num-K,stu1d+num,cmp);
        stu1d[num-K].loc_rank=1;
        for (int l=1;l<K;l++)
        {
        	if (stu1d[num-K+l].score!=stu1d[num-K+l-1].score) stu1d[num-K+l].loc_rank=l+1;
        	else stu1d[num-K+l].loc_rank=stu1d[num-K+l-1].loc_rank;
		}
    }
printf("%d\n",num);
sort(stu1d,stu1d+num,cmp);
//stu1d[0].fin_rank=1;
//        for (int l=1;l<num;l++)
//        {
//        	if (stu1d[l].score!=stu1d[l-1].score) stu1d[l].fin_rank=l+1;
//        	else stu1d[l].fin_rank=stu1d[l].fin_rank;
//		}
//    
   
//制作排名

//stu1d[0]=stu2d[0][0];num++;
//int st=0;
//for (int i=0;i<N;i++)
//{
//	stu2d[i][0].loc_rank=1;
//	
//
//	for (int j=0;j<Klist[i];j++)
//	{
//		if(j>0)
//		{
//		if( stu2d[i][j].score!=stu2d[i][j-1].score)
//		stu2d[i][j].loc_rank=j+1;
//		else
//		stu2d[i][j].loc_rank=stu2d[i][j-1].loc_rank;
//		}
//		stu1d[num++]=stu2d[i][j];
//
		printf("%s %d %d!!",stu2d[i][j].id,stu2d[i][j].score,stu2d[i][j].loc_rank);
//	}

//sort(stu1d,stu1d+num+1,cmp);
stu1d[0].fin_rank=1;
printf("%s %d %d %d\n",stu1d[0].id,stu1d[0].fin_rank,stu1d[0].loc,stu1d[0].loc_rank);

	for (int i=1;i<num;i++ ) 
	{
		if (stu1d[i].score!=stu1d[i-1].score)
		stu1d[i].fin_rank=i+1;
		else
		stu1d[i].fin_rank=stu1d[i-1].fin_rank;
		printf("%s %d %d %d\n",stu1d[i].id,stu1d[i].fin_rank,stu1d[i].loc,stu1d[i].loc_rank);
	}
	

}



对了 

这里贴上一位老哥的代码ac

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct Student {
    char name[20];
    int score;
    int kc, kn;     //kc 考场     kn 内部考场
} stu[30005];
bool cmp(struct Student a, struct Student b) {
    if(a.score != b.score) return a.score > b.score;
    else return strcmp(a.name, b.name) < 0;
}
int main() {
    int N, K, n = 0;
    cin>>N;
    for(int i = 0; i < N; i++){
        cin>>K;
        for(int j = 0; j < K; j++){
            cin>>stu[n].name>>stu[n].score;
            stu[n++].kc = i + 1;
        }
        sort(stu + n - K, stu + n, cmp);
        stu[n - K].kn = 1;
        for(int j = n - K + 1; j < n; j++){
            if(stu[j - 1].score == stu[j].score)
                stu[j].kn = stu[j - 1].kn;
            else
                stu[j].kn = j + 1 - (n - K);               //j 的初始值是在变的
        }
    }
    sort(stu, stu + n, cmp);
    cout<<n<<endl;
    int jl = 1;
    for(int i = 0; i < n; i++){
        if(i > 0 && stu[i].score != stu[i - 1].score){
            jl = i + 1;
        }
        cout<<stu[i].name<<" "<<jl<<" "<<stu[i].kc<<" "<<stu[i].kn<<endl;
    }
    return 0;
}


网站公告

今日签到

点亮在社区的每一天
去签到