这里第一次自己尝试了map,以及iterator,这里主要最后的imp输出要用cout不能用printf,不知为何。string类型可以直接>或<比较
!!!printf("%s\n",imp->id.c_str()) ,这样就可以显示了!!!
这个是参考,不是很懂:http://blog.csdn.net/lv_zj/article/details/16114065
这是自己写的”
#include<iostream>
#include<vector>
#include<string>
#include<string.h>
#include<algorithm>
#include<map>
using namespace std;
class CA
{
public:
enum{N=102,K=302};
void run();
private:
int n,k[N+1],sum;
struct testee
{
string id;
int score;
int totrank;
int location;
int locrank;
bool operator < (const testee &a) const
{
if(score>a.score)
return true;
else if((score==a.score)&&(id<a.id))
return true;
else
return false;
}
};
map<int,vector<testee> > mall,mp[N];
};
void CA::run()
{
cin>>n;
int i,j;
sum=0;
for(i=1;i<=n;i++)
{
cin>>k[i];
sum=sum+k[i];
for(j=1;j<=k[i];j++)
{
testee a;
cin>>a.id;
cin>>a.score;
a.location=i;
mall[a.score].push_back(a);
//mp[i][a.score].push_back(a);
}
}
printf("%d\n",sum);
//if(sum==0)
//return;
map<int,vector<testee> >::iterator im;
for(im=mall.begin();im!=mall.end();im++)
{
sort(im->second.begin(),im->second.end());
}
vector<testee>::iterator imp;
/*for(i=1;i<=n;i++)
{
printf("%d\n",i);
for(imp=mall[i].begin();imp!=mall[i].end();imp++)
{
cout<<imp->id<<' '<<imp->score<<endl;
}
}*/
//printf("%s\n",mall[100][0].id);
//printf("%s\n",mall[100][1].id);
//printf("%s\n",mall[100][2].id);
int tmp;
int tm[N];
int co[N];
for(i=1;i<=n;i++)
{
co[i]=1;
}
int count=1;
for(i=100;i>=0;i--)
{
tmp=count;
for(j=1;j<=n;j++)
tm[j]=co[j];
for(imp=mall[i].begin();imp!=mall[i].end();imp++)
{
imp->totrank=tmp;
imp->locrank=tm[imp->location];
count++;
co[imp->location]++;
cout<<imp->id<<' '<<imp->totrank<<' '<<imp->location<<' '<<imp->locrank<<endl;
//printf("%s %d %d %d\n",imp->id,imp->score,imp->totrank,imp->location);
}
}
}
int main()
{
freopen("test.txt","r",stdin);
CA *a=new CA;
a->run();
return 0;
}