题目
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改进呢?