此题如果一下子想到了思路确实是应该很快出的,这题暴露了我基本功不扎实的弱点,对qsort中cmp函数和sort中cmp函数的使用没有完全弄明白,通过这题终于搞明白了啊,初学者如果只是按网上的写法套个模板还是远远不够的,因为解决的问题是在不断变化的,一定要深入研究其原理,才能遇神杀神,遇佛杀佛。
既然提到了这题,我说下两个函数的不同之处吧,我觉得肯定有很多人不会,我记得很多人还跟我说这两个函数的写法是一样的。。。。。至于qsort的cmp函数中要用const void * 这些我就不说了,直接切入主题,对qsort的cmp函数,返回值是int,这个函数要考虑<,=,>三种情况,而sort的cmp函数,返回值是bool ,也就是只有两种情况,如果你用过sort进行结构体排序的话,你会发现其实你只要重载小于符号就可以进行排序,其实这个cmp函数就等价于你重载了结构体的<运算符,明白了么?
Sort版:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
map <string,int> mm;
map <int,string> mm2;
int points[10] = { 25, 18, 15 , 12 , 10 , 8, 6 , 4, 2, 1 };
struct node
{
int a[1010];
int p;
int pos;
};
node per[2000];
int ca,n;
string s;
int id=0;
bool cmp1(node a, node b)
{
if (a.p != b.p)
return a.p > b.p;
for (int i = 0; i < id; i ++)
if (a.a[i] != b.a[i])
return a.a[i] > b.a[i];
return false;
}
bool cmp2(node a, node b)
{
if (a.a[0] != b.a[0])
return a.a[0] > b.a[0];
if (a.p != b.p)
return a.p > b.p;
for (int i = 1; i < id; i ++)
if (a.a[i] != b.a[i])
return a.a[i] > b.a[i];
return false;
}
int main()
{
cin >> ca;
mm.clear();
mm2.clear();
while(ca--)
{
cin >> n;
for (int i = 0; i < n; i ++)
{
cin >> s;
if (mm.find(s) == mm.end())
{
mm[s] = id;
mm2[id]=s;
per[id].pos=id;
per[id].p = 0;
id++;
}
per[mm[s]].a[i]++;
if (i < 10)
per[mm[s]].p += points[i];
}
}
sort(per, per + id, cmp1);
cout << mm2[per[0].pos]<< endl;
sort(per, per + id, cmp2);
cout << mm2[per[0].pos] << endl;
return 0;
}
Qsort版
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
using namespace std;
int point[10]={25,18,15,12,10,8,6,4,2,1};//前10名得到的分数
map<string,int>mm;
map<int,string>mm2;
struct node
{
int p;
int a[2000];
int pos;
}per[2000];
int id=0;
int getid(string s)
{
if(mm.find(s)==mm.end())
{
mm[s]=id++;
mm2[id-1]=s;
return id-1;
}
else
return mm[s];
}
/**//*
bool cmp1(node a, node b)
{
if (a.p != b.p)
return a.p > b.p;
int i;
for (i = 0; i < 100; i ++)
if (a.a[i] != b.a[i])
return a.a[i] > b.a[i];
return false;
}
bool cmp2(node a,node b)
{
if(a.a[0]!=b.a[0])
return a.a[0]>b.a[0];
if(a.p!=b.p)
return a.p>b.p;
int i;
for(i=0;i<id;i++)
if(a.a[i]!=b.a[i])
return a.a[i]>b.a[i];
return false;
}
*/
int cmp1(const void *a,const void *b)
{
node *c=(node*)a;
node *d=(node*)b;
if(c->p!=d->p)
{
if(c->p > d->p)
return -1;
else
return 1;
}
int i;
for(i=0;i<id;i++)
{
if(c->a[i]>d->a[i])
return -1;
else if(c->a[i] < d->a[i])
return 1;
}
return 0;
}
int cmp2(const void *a,const void *b)
{
node *c=(node*)a;
node *d=(node*)b;
if(c->a[0]>d->a[0])
return -1;
else if(c->a[0] < d->a[0])
return 1;
if(c->p!=d->p)
{
if(c->p > d->p)
return -1;
else
return 1;
}
int i;
for(i=1;i<id;i++)
{
if(c->a[i]>d->a[i])
return -1;
else if(c->a[i] < d->a[i])
return 1;
}
return 0;
}
int main()
{
int ca;
scanf("%d",&ca);
mm.clear();
mm2.clear();
while(ca--)
{
int n;
scanf("%d",&n);
//cin.ignore();
string s;
int i;
for(i=0;i<n;i++)
{
cin>>s;
int k=getid(s);
if(i<10)
{
per[k].p+=point[i];
}
per[k].a[i]++;
per[k].pos=k;
}
}
qsort(per,id,sizeof(per[0]),cmp1);
cout<<mm2[per[0].pos]<<endl;
qsort(per,id,sizeof(per[0]),cmp2);
cout<<mm2[per[0].pos]<<endl;
return 0;
}
基本功基本功^_^