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))))