kickstart Round H # 1 h-index Python solution

round H 第一题是求h-index,听起来不难,但写起来,用sort然后比较文章数和引用因子大小,线下跑的通,一到线上就RE,永远都是RE。。。后来发现线上的python只有两个包,一个是numpy一个是scipy,如果直接加载pandas自然是RE的,但不用包还是RE,所以改了个思路。

思路:(动态规划)
假设目前有x篇文章,h-index记为hindex,此时,有一篇新的文章加入,其引用次数为C,若C<=hindex,此时hindex不变;若C>hindex,此时需继续判断原有文章引用次数大于(hindex+1)的篇数是否达到hindex篇,若是,则此时hindex=hindex+1;若不是,则hindex不发生变化。 从该思路来看,我们需统计现有文章引用次数大于(hindex+1)的篇数

所用数据结构:
hindex 是一个含N个元素的列表,因为题目中假设每篇paper引用次数都大于等于1,所以hindex[0]=1
SS也是一个含N个元素的列表,SS[x]表示当前所有文章中引用次数大于等于hindex[x]的文章数
C是一个dict,相当于是统计不同引用次数对应的文章数,类似于counter的功能,但由于担心平台上并没有counter所在库,所以此处手动实现了counter功能。C[hindex[x]]就是引用次数为hindex[x]的文章数,所以SS[x]-C[hindex[x]]得到的结果就是当前引用次数大于hindex[x]的文章数

具体程序如下:

def count_paper(x):
    if x not in C:
        return 0
    else:
        return C[x]

    
case=int(input())
for k in range(1,case+1):
    M=int(input())
    A=list(map(int, input().split()))
    hindex=[0]*M
    hindex[0]=1 # 因为所有文章引用次数都大于等于1
    SS=[0]*M
    SS[0]=1
    C={}
    C[A[0]]=1
    for jj in range(1,M):
        if A[jj] not in C:
            C[A[jj]]=0
        C[A[jj]]+=1  # 实现counter功能
        if A[jj]>hindex[jj-1]:
            if SS[jj-1]-count_paper(hindex[jj-1])>=hindex[jj-1]:
                hindex[jj]=hindex[jj-1]+1
                SS[jj]=SS[jj-1]-count_paper(hindex[jj-1])+1
                ### SS[jj]是 引用次数大于hindex[jj-1]的文章数
                ### SS[jj]是 引用次数大于等于hindex[jj]的文章数
                ### SS[jj-1]是引用次数**大于等于**hindex[jj-1]的文章数
                ### count_paper(hindex[jj-1])是引用次数为hindex[jj-1]的文章数
                ### 加1是因为新加入的这篇文章满足判断
            else:
                hindex[jj]=hindex[jj-1]
                SS[jj]=SS[jj-1]+1
        elif A[jj]==hindex[jj-1]: 
            hindex[jj]=hindex[jj-1]
            SS[jj]=SS[jj-1]+1  # 
        else:
            hindex[jj]=hindex[jj-1]
            SS[jj]=SS[jj-1]
            
    
    print("Case #{}: {}".format(k, " ".join(map(str, hindex))))     
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值