PAT 1047 Student List for Course

题目

在这里插入图片描述
Sample Input:
10 5
ZOE1 2 4 5
ANN0 3 5 2 1
BOB5 5 3 4 2 1 5
JOE4 1 2
JAY9 4 1 2 5 4
FRA8 3 4 2 5
DON2 2 4 5
AMY7 1 5
KAT3 3 5 4 2
LOR6 4 2 4 1 5
Sample Output:
1 4
ANN0
BOB5
JAY9
LOR6
2 7
ANN0
BOB5
FRA8
JAY9
JOE4
KAT3
LOR6
3 1
BOB5
4 7
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1
5 9
AMY7
ANN0
BOB5
DON2
FRA8
JAY9
KAT3
LOR6
ZOE1

AC代码

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
char name[40005][5];
using namespace std; 
bool cmp(int a,int b)
{
	return strcmp(name[a],name[b])<0;//用到索引排序的思想,排序的是索引下标,改变访问次序。
	// 传入的是vector内容int型数据,说明对vector内容排序。
	//name必须是全局变量! 
}
int main()
{
	int n,k,xb;
	int i,num,j;
	char temp[5]={0};
	int temp2;
	//vector<int>::iterator it;
	vector<int> arr[2505];//课程的名字,即1,2,3,4。。。	
	scanf("%d%d",&n,&k);
	for(i=0;i<n;i++)
	{
		scanf("%s",temp);
		strcpy(name[i],temp);
		scanf("%d",&num);
		{
			for(j=0;j<num;j++)
			{
				scanf("%d",&temp2);
				xb=temp2-1;//课程下标
				arr[xb].push_back(i);//动态扩容 
			}
		}
	}	
	for(i=0;i<k;i++)
	{
		printf("%d %d\n",i+1,arr[i].size());
		sort(arr[i].begin(),arr[i].end(),cmp);//排序操作 
		/*for(it=arr[i].begin();it!=arr[i].end();it++)
		{
			printf("%s\n",name[*it]);	
		}*/	
		for(j=0;j<arr[i].size();j++)
		{
			printf("%s\n",name[arr[i][j]]); 
		} 
	}	
	
} 

原来代码 (最后一个测试数据没有过)

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
struct ST
{
	char name[40000][6];//一定要给第一维度取定。【】【5】这样只在 函数定义时出现 ;边定义边赋值出现。
	int top;
};
/*bool cmp(char a[5],char b[5])
{
	return strcmp(a,b)<0;
}*/
void quicksort(ST arr[],int xb,int left,int right)
{
	int i,j;
	char temp[6],t[6];
	if(left>right) return;
	
	i=left;j=right;
	strcpy(temp,arr[xb].name[left]);
	while(i<j)
	{
		while(i<j && strcmp(temp,arr[xb].name[j])<0 )
		{
			j--;
		}
		while(i<j && strcmp(arr[xb].name[j],temp)<0 )
		{
			i++;
		}
		if(i<j)
		{
			strcpy(t,arr[xb].name[i]);
			strcpy(arr[xb].name[i],arr[xb].name[j]);
			strcpy(arr[xb].name[j],t);		
		}
	}
	strcpy(arr[xb].name[left],arr[xb].name[i]);
	strcpy(arr[xb].name[i],temp);
	quicksort(arr,xb,left,i-1);
	quicksort(arr,xb,i+1,right);
	return ;
	
}
int main()
{
	int n,k;
	int i,num,j;
	char temp[6]={0};
	int xb;
	
	scanf("%d%d",&n,&k);//最后一的段错误也许是K足够大,大到了2500,然后结构体每个又有4w的内存。,所以浪费了很多空间。用vector,因为是动态数组,可以用v.push_back(i)来扩容。
    ST arr[k];
	/*for(i=0;i<k;i++)好像可以不用初始化 
	{
		arr[i].top=0;
		fill(arr[i].name[0],arr[i].name[0]+5*100,'\0');	
		//arr[i].name[]={0};
	}*/
	//v.resize(n);
	for(i=0;i<n;i++)
	{
		memset(temp,'\0',6);
		scanf("%s%d",temp,&num);
		for(j=0;j<num;j++)
		{
			scanf("%d",&xb);
			xb--;
			strcpy(arr[xb].name[arr[xb].top++],temp);
			//strcpy(v.begin()+xb,temp);
		}
	}
	
	for(i=0;i<k;i++)
	{
		printf("%d %d\n",i+1,arr[i].top);
		//sort(arr[i].name[0],arr[i].name[0]+arr[i].top,cmp);
		quicksort(arr,i,0,arr[i].top-1);
		for(j=0;j<arr[i].top;j++)
		{
			printf("%s\n",arr[i].name[j]);
		}
	} 

		return 0;	
} 

总思路:

以课程为单位,有几个课程就有几个一维数组。数组的内容就是选这门功课的学生名字。最后的输出就是每个一维数组的长度 和 该数组内容排序的结果。这个思路是根据它要排序来的,因为排序要把内容装入数组里面。
AC代码思路:和上面思路差不多,区别就在 数组的内容就是选这门功课的学生名字在name[]数组中的下标。排序没有对name[]数组直接排序,而是改变访问name[]数组的顺序(索引排序)。

实现每个数组装人的名字。好像可以用vector

struct ST
{
	char name[100][5];//一定要给第一维度取定。【】【5】这样只在 函数定义时出现 或者 main中边定义边赋值出现。
	int top;
};
...
main()
{
    ...
    ST arr[2505];//那个一维数组,内容主要就是就是若干个字符串。
    ...
}

改进,提升为vector操作

vector<int> arr[2505];
/*相当于是动态的int二维数组 或者是2505个 vector<int>*/

排序,怎么用sort函数排序字符串呢?(有点编译错误)

原来的代码自己写了快速排序算法。 怎么用sort改进呢?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值