题解 | #记票统计#

记票统计

http://www.nowcoder.com/practice/3350d379a5d44054b219de7af6708894

快速排序+二分查找
快速排序的时候排序指向字符串的指针
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct candidate{
    char name[20];
    int cnt;
}Candi;

int cmp(const void *p1,const void *p2);
int binsearch(const char *vote,Candi *pt_index[],int max);

int main(void)
{
    int n,cnt,i,invalid;
    char tmp[20];
    while(scanf("%d",&n) == 1){
        Candi index[n];
        Candi *pt_index[n];
        
        for(i=0;i<n;i++){
            scanf("%s",&index[i].name);
            index[i].cnt = 0;
            pt_index[i] = &index[i];
        }
        qsort(pt_index,n,sizeof(Candi *),cmp);
        scanf("%d",&cnt);
        invalid = cnt;
        for(i=0;i<cnt;i++){
            scanf("%s",tmp);
            invalid -= binsearch(tmp,pt_index,n-1);
        }
        for(i=0;i<n;i++){
            printf("%s : %d\n",&index[i].name,index[i].cnt);
        }
        printf("Invalid : %d\n",invalid);
    }
    
    return 0;
}

int cmp(const void *p1,const void *p2)
{
    return strcmp((*(Candi **)p1)->name,(*(Candi **)p2)->name);
}

int binsearch(const char *vote,Candi *pt_index[],int max)
{
    int min = 0,mid = max/2,flag = 0,i = 0;
    for(;min <= max;mid = (min + max)/2){
        if(strcmp(vote,pt_index[mid]->name) == 0){
            flag = 1;
            pt_index[mid]->cnt ++;
            break;
        }else if(strcmp(vote,pt_index[mid]->name) < 0){
            max = mid - 1;
        }else{
            min = mid + 1;
        }
    }
    return flag;
}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务