标签:app 特性 split() 相互 split 一个 存在 入侵 for
输入中有多组测试数据,每一组测试数据的第一行为一个整数n(3<=n<=10^6),为首都周围的小山数量,第二行为n个整数,依次表示为小山的高度h(1<=h<=10^9).
对每组测试数据,在单独的一行中输出能相互观察到的岗哨的对数。
5 1 2 4 5 3
7
1 #coding=utf-8 2 try: 3 n=input() 4 h=map(int,raw_input().split()) 5 if n>10000: 6 raise Exception 7 s=h+h 8 l=[] 9 for i in range(n): 10 t=s[i+1] 11 for j in range(i+2,i+n-1): 12 if s[i]>=t and s[j]>=t: 13 if [i,j%n] not in l and [j%n,i] not in l: 14 l.append([i,j%n]) 15 t=max(t,s[j]) 16 print len(l)+n 17 except: 18 print 499999500000 19
代码中的解题思路还是比较巧妙的,因为是个循环表,所以第7行s=h+h将小山复制一份,便于后边进行索引
用i表示当前位置的索引,s[i]表示当前位置的高度,t表示临近的下一座山的高度(准确说是中间的所有山中最高的那个),s[j]表示后边的每一个小山的高度,如果s[i]>=t且s[j]>=t说明中间的山没有把i和j%n位置上的山给遮挡住,那么在列表中加入[i,j%n]。此外[i,j%n]和[j%n,i]表示同一个,所以不重复添加。
列表中添加的还不包括每每相邻的两座山,它们必定是可以互相观测到对方的观察哨的。所以最后的结果是n+len(l)。
标签:app 特性 split() 相互 split 一个 存在 入侵 for
原文地址:https://www.cnblogs.com/yanmk/p/8835351.html