比赛 20111110 评测结果 AAAAAAAAAE
题目名称 韩国明星 最终得分 90
用户昵称 QhelDIV 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2011-11-10 10:15:33
显示代码纯文本
#include<fstream>
#include<cstdlib>
#include<string>
using namespace std;
ifstream fin("star.in");
ofstream fout("star.out");
int n,K;
class STAR
{
public:
	string name;
	long long like,where;
}Star[10002];
string S,SS;

int Compare(const void *p1,const void *q1)
{
int i,Lp,Lq;
STAR *p=(STAR *)p1;
STAR *q=(STAR *)q1;
Lp=p->name.length();
Lq=q->name.length();
	for(i=0;i<=(Lp>Lq?Lq:Lp)-1;i++)
	{
		if(p->name[i] > q->name[i])
			return 1;
		if(p->name[i] < q->name[i])
			return -1;
	}
	if(Lp>Lq)
		return 1;
	if(Lq>Lp)
		return -1;
	return 0;
}

int find(int st,int en,string *p)
{
int i,mid,l1,l2;bool flag,bo;
	for(;st!=en;)
	{
		mid=st+en;mid/=2;
		S="\0";
		S=Star[mid].name;
	l1=S.length();l2=(*p).length();
		flag=true;//前面的是否比后面的字典序大
		bo=true;//字符串之间是否存在包含关系
		for(i=0;i<=(l1>l2?l2:l1)-1;i++)
		{
			if(S[i] > (*p)[i])
			{
				flag=false;
				bo=false;
				break;
			}
			if(S[i] < (*p)[i])
			{
				flag=true;
				bo=false;
				break;
			}
		}
		if(bo==true)
		{
			if(l1>=l2)
				flag=false;
			else
				flag=true;
		}
		
		if(flag==true)
			st=mid+1;
		else
			en=mid;
	}
	return st;
}
void init()
{
int i,pos,value;
string S="\0";
	fin>>n;
	for(i=1;i<=n;i++)
	{
		fin>>Star[i].name;
		Star[i].where=i;
	}
	qsort(Star+1,n,sizeof(STAR),Compare);	
	fin>>K;
	for(i=1;i<=K;i++)
	{
		SS="\0";
		fin>>SS;
		fin>>value;
		pos=find(1,n,&SS);
		Star[pos].like+=value;
	}
}
int Com(const void *p,const void *q)
{
	return ((STAR *)q)->like - ((STAR *)p)->like;
}

void OUTPUT()
{
int i;
	for(i=1;i<=n;i++)
		fout<<Star[i].name<<endl<<Star[i].like<<endl;
}

int main()
{
	init();	
	
	qsort(Star+1,n,sizeof(STAR),Com);
	
	OUTPUT();
	
	fin.close();
	fout.close();
	return 0;
}