比赛 |
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;
}