题解 | #记票统计#
记票统计
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; }