这道题主要是要求解在每个y值时:在>=y时有几个1,<y时有几个0.
方法一(超时)
采用暴力破解,对每个数都从头数1和0的个数
def predict(y,th):
if y<th:
return 0
else:
return 1
m=int(input())
a=[0]*m
y=[0]*m
for i in range(m):
a[i]=list(map(int,input().split()))
y[i]=a[i][0]
y=list(set(y))
for i in range(len(y)):
count=0
for j in range(m):
if predict(a[j][0],y[i])==a[j][1]:
count+=1
y[i]=[y[i],count]
y=sorted(y,key=(lambda x:[x[1],x[0]]),reverse=True)
print(y[0][0])
方法二(超时)
如例1的例子,当求出<3中有多少个0后,求<5中有多少0,只需求=3中有几个0.同理,求出>=5有多少1时,求>=3中有多少1,只需求=3中有几个1.
采用多个二维数组的方法,但依旧用到两层循环,导致了超时。
m=int(input())
a=[0]*m
y=[]
for i in range(m):
a[i]=list(map(int,input().split()))
a=sorted(a,key=(lambda x:x[0]),reverse=False)
for i in range(len(a)):
if a[i][0] not in y:
y.append(a[i][0])
y_len=len(y)
less=[0]*y_len
more=[0]*(y_len+1)
result=[0]*y_len
less[0]=0
more[y_len]=0
index=0
for i in range(1,y_len):
count=0
while(a[index][0]==y[i-1] and index<m):
if a[index][1]==0:
count+=1
index+=1
less[i]=less[i-1]+count
for i in range(y_len-1,-1,-1):
count=0
while(a[index][0]==y[i] and index>=0):
if a[index][1]==1:
count+=1
index-=1
more[i]=more[i+1]+count
for i in range(y_len):
result[i]=less[i]+more[i]
Max=max(result)
data=[]
for i in range(y_len):
if Max==result[i]:
data.append(y[i])
print(max(data))
方法三:
由于在方法二中,大体思路已经正确,只需降低时间复杂度。由于在统计数据时,用到两层循环,而内层循环存在的原因是需要对所有数据中的每个进行分析。如统计=1中的0的个数,则需要对排好序的a列表中数判断其是否y为1,而后判断是否1的result为0,因而用到两层循环。
所以考虑采用字典的形式,省去内层循环,在输入数据的时候即统计每个y中result=0的个数和=1的个数。从而降低时间复杂度。
m=int(input())
a={}
ylist=[]
data=[]
ylen=0
for i in range(m):
y,result=list(map(int,input().split()))
if y not in a:
a[y]=[0,0]
ylist+=[y]
ylen+=1
if result==0:
a[y][0]+=1
else:
a[y][1]+=1
ylist.sort()
lesslist=[0]*ylen
alllist=[0]*ylen
lesslist[ylen-1]=a[ylist[ylen-1]][1]
for i in range(ylen-2,-1,-1):
temp=lesslist[i+1]+a[ylist[i]][1]
lesslist[i]=temp
for i in range(1,ylen):
temp=alllist[i-1]+a[ylist[i-1]][0]
alllist[i]=temp
for i in range(ylen):
alllist[i]+=lesslist[i]
Max=max(alllist)
for i in range(ylen):
if alllist[i]==Max:
data+=[ylist[i]]
print(max(data))