1039. Course List for Student (25)
http://pat.zju.edu.cn/contests/pat-a-practise/1039
题目大意是给出每个课程和选这个课程的学生名单。统计一下每个人各选了什么课。
好烦字符串排序题~不过细心点一般容易得分。
看到学生人数40000,课程数2500。最初傻傻的还每个人给开bool course[2505]这样的大空间,哈希统计~
尼玛每个能选到这么多课么?果然最后一个数据过不去。用vector来保存课程,比较灵活。
先贴个辛辛苦苦码,没全过的:
View Code
#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct Node{ char name[10]; int course_num; bool course[2501]; }node[40001]; int main(){ int N,K; char name[10]; int i,j,k; int ptr=0; scanf("%d %d", &N, &K); for(i=0;i<N;i++){ memset(node[i].course,false,sizeof(node[i].course)); node[i].course_num=0; } for(i=0;i<K;i++){ int index, stu_num; scanf("%d %d",&index,&stu_num); for(j=0;j<stu_num;j++){ scanf("%s",name); for(k=0;k<ptr;k++){ if(strcmp(node[k].name,name)==0){ node[k].course[index] = true; //printf("name:%s Course:%d++\n",node[k].name,index); node[k].course_num++; break; } } if(k==ptr){ sprintf(node[ptr].name,"%s",name); node[ptr].course[index]=true; node[ptr].course_num++; ptr++; } } } for(i=0;i<N;i++){ scanf("%s",name); printf("%s",name); for(j=0;j<ptr;j++){ if(strcmp(name,node[j].name)==0){// printf(" %d",node[j].course_num); for(k=1;k<=K;k++){ if(node[j].course[k]){ printf(" %d",k); } } break; } } if(j==ptr){ printf(" 0\n"); } printf("\n"); } return 0; }
再贴一个queue保存课程数的,仍然没过那个case (后来再修改修改)
View Code
#include <stdio.h> #include <string.h> #include <algorithm> #include <queue> using namespace std; struct cmp{ bool operator() (int a, int b){ return a>b; } }; struct Node{ char name[5]; priority_queue<int, vector<int>, cmp> course; }node[40001]; int main(){ int N,K; char name[10]; int i,j,k; int ptr=0; scanf("%d %d", &N, &K); for(i=0;i<K;i++){ int index, stu_num; scanf("%d %d",&index,&stu_num); for(j=0;j<stu_num;j++){ scanf("%s",name); for(k=0;k<ptr;k++){ if(strcmp(node[k].name,name)==0){ node[k].course.push(index); break; } } if(k==ptr){ sprintf(node[ptr].name,"%s",name); node[ptr].course.push(index); ptr++; } } } for(i=0;i<N;i++){ scanf("%s",name); printf("%s",name); for(j=0;j<ptr;j++){ if(strcmp(name,node[j].name)==0){// printf(" %d",node[j].course.size()); while(!node[j].course.empty()){ printf(" %d",node[j].course.top()); node[j].course.pop(); } break; } } if(j==ptr){ printf(" 0\n"); } printf("\n"); } return 0; }
能过的代码
View Code
#include <stdio.h> #include <map> #include <set> #include <string.h> #include <string> #include <algorithm> #include <vector> using namespace std; bool get(int& a) { if( scanf("%d",&a) == EOF ) return false ; return true ; } const int maxn = 2500*200 ; int nimei[maxn] , cnt ; int id[26][26][26][10] ; int bs(int key,int l,int r) { int mid ; while ( l <= r ) { mid = ( l + r ) >> 1 ; if( nimei[mid] > key ) r = mid - 1 ; else l = mid + 1 ; } return r ; } int main() { int n , m ; get(n); get(m); int i , j , k ; int idCnt = 1 ; cnt = 0 ; for ( i = 0 ; i < m ; i++) { get(j); get(k); char str[16] ; while(k--) { scanf("%s",str); int &temp = id[str[0]-'A'][str[1]-'A'][str[2]-'A'][str[3]^48] ; if( temp == 0 ) temp = idCnt++; nimei[cnt++] = ( temp << 12 ) | j ; } } sort(nimei,nimei+cnt); char name[16] ; while(n--) { scanf("%s",name); int t = id[name[0]-'A'][name[1]-'A'][name[2]-'A'][name[3]^48] ; if( t == 0 ) { printf("%s 0\n",name); continue; } j = bs(t<<12,0,cnt-1) ; k = bs((t+1)<<12,j,cnt-1); printf("%s %d",name,k-j); for ( j++; j <= k ; j++) { printf(" %d",nimei[j] &0x00000fff); } puts(""); } }

浙公网安备 33010602011771号