比赛 20121106 评测结果 AAAAAAAAAAAA
题目名称 H 指数因子 最终得分 100
用户昵称 yuan 运行时间 0.008 s
代码语言 C++ 内存使用 3.15 MiB
提交时间 2012-11-06 12:31:55
显示代码纯文本
#define M 105
#include <fstream>
#include <string>
using namespace std;

int main()
{
	int i,j,k,n,p_u[M]={0},h[M]={0},m,max,s,t;
	string nm[M]={""},p_nm[M]={""},name="";
	char ch;
	ifstream fin("publish.in");
	ofstream fout("publish.out");
	fin>>n;
	for(i=1;i<=n;i++)fin>>p_nm[i];//每篇论文作者
	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		{
			fin>>ch;
			if(ch=='0'||ch=='1')p_u[j]=p_u[j]+(ch-'0');//第j篇论文被引用累计次数
		}
	for(i=1;i<=n-1;i++)//排序
		for(j=1;j<=n-i;j++)
		{
			if(p_nm[j]>p_nm[j+1])
			{
				t=p_u[j];p_u[j]=p_u[j+1];p_u[j+1]=t;
				name=p_nm[j];p_nm[j]=p_nm[j+1];p_nm[j+1]=name;
			}
		}
	i=1; int ps=0;//作者总数
	while(i<=n)
	{
		name=p_nm[i];//第i篇论文的作者,接下来统计该作者有多少篇论文,并计算h指数
		j=i;	max=0;
		while(j<=n&&p_nm[j]==name)j++;//统计该作者论文数:j-i
		for(m=1;m<=n-1;m++)
		{//计算该作者h指数,枚举每一个可能的指数,最大为n-1次
			s=0;
			for(k=i;k<=j-1;k++)//论文编号范围
				if(p_u[k]>=m)s++;//如果论文k至少被引用m次,s++
			if(s>=m&&s>max)max=m;//是否至少有s篇被至少引用m次
		}
		h[++ps]=max;nm[ps]=name;//存储某作者h指数和姓名
		i=j;//j指向下一个作者第一篇论文处
	}
	n=ps;//总人数
	for(i=1;i<=n-1;i++)//排序
		for(j=1;j<=n-i;j++)
		{
			if(h[j]<h[j+1]||h[j]==h[j+1]&&nm[j]>nm[j+1])
			{
				t=h[j];h[j]=h[j+1];h[j+1]=t;
				name=nm[j];nm[j]=nm[j+1];nm[j+1]=name;
			}
		}
	for(i=1;i<=n;i++)fout<<nm[i]<<' '<<h[i]<<endl;
	fin.close();fout.close();
	return 0;
}