俊介三

一天更新一点,一天积累一点

导航

1039. Course List for Student (25)

Posted on 2013-03-06 23:31  俊介三在前进  阅读(292)  评论(0)    收藏  举报

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("");  
        }  
    }