tle了n次后,经过波波的指导,成功的ac了这道小水题.写篇报告记录一下~~
这道题的难点是字符串的匹配.通过用二分匹配法可以在规定的时间内对已排序的数组进行查找.这应该是对qsort和bsearch应用的一种训练.而我觉得题目本身就对储存结构有比较明显的提示.
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- //数据储存
- typedef struct data
- {
- char names[35];
- int point;
- }data;
- // 用于qsort和bsearch的比较函数
- int compare(const void *p1,const void *p2)
- {
- data a=*(data *)p1;
- data b=*(data *)p2;
- if( strcmp(a.names,b.names) > 0)
- return 1;
- if( !strcmp(a.names,b.names))
- return 0;
- return -1;
- }
- //找出liming的位置
- int findPosition(data* D,int size,int mPosition)
- {
- int temp = D[mPosition].point ,res = 1;
- for( int i = 0; i < size; i++)
- if( D[i].point > temp)
- res++;
- return res;
- }
- int main()
- {
- data *Data;
- int i,j,n,m,posiMing;
- scanf("%d/n",&n);
- Data = new ( data[n]);
- for( i = 0; i < n;i++) {
- gets(Data[i].names);
- Data[i].point = 0;
- }
- qsort(Data,n,sizeof(data),compare);
- for( int i = 0; i < n;i++)
- if(!strcmp(Data[i].names ,"Li Ming")) {
- posiMing = i;
- break;
- }
- scanf("%d/n",&m);
- for( i = 0; i < m; i++) {
- data *position,temp ;
- for( j = 0; j < n; j++) {
- scanf("%d ",&temp.point);
- gets(temp.names);
- // 找出与名字相匹配的元素的位置
- position = (data*) bsearch(&temp,Data,n,sizeof(data),compare);
- position->point += temp.point;
- }
- printf("%d/n",findPosition(Data,n,posiMing));
- }
- }