初稿
总是部分错误,不知为何。
#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;
}