牛客5(京東)

保衛方案

戰爭遊戲的至關重要環節就要到來了,這次的結果將決定王國的生死存亡,小B負責首都的防衛工作。首都位於一個四面環山的盆地中,周圍的n個小山構成一個環,作爲預警措施,小B計劃在每個小山上設置一個觀察哨,日夜不停的瞭望周圍發生的情況。 一旦發生外地入侵事件,山頂上的崗哨將點燃烽煙,若兩個崗哨所在的山峯之間沒有更高的山峯遮擋且兩者之間有相連通路,則崗哨可以觀察到另一個山峯上的烽煙是否點燃。由於小山處於環上,任意兩個小山之間存在兩個不同的連接通路。滿足上述不遮擋的條件下,一座山峯上崗哨點燃的烽煙至少可以通過一條通路被另一端觀察到。對於任意相鄰的崗哨,一端的崗哨一定可以發現一端點燃的烽煙。 小B設計的這種保衛方案的一個重要特性是能夠觀測到對方烽煙的崗哨對的數量,她希望你能夠幫她解決這個問題。
輸入描述:
輸入中有多組測試數據,每一組測試數據的第一行爲一個整數n(3<=n<=10^6),爲首都周圍的小山數量,第二行爲n個整數,依次表示爲小山的高度h(1<=h<=10^9).

輸出描述:
對每組測試數據,在單獨的一行中輸出能相互觀察到的崗哨的對數。

輸入例子1:
5
1 2 4 5 3

輸出例子1:
7

根據左神的思路,寫了一下單調棧,寫蒙了這個題,通過了90%.
您的代碼已保存
內存超限:您的程序使用了超過限制的內存
case通過率爲90.00%

#coding=utf-8
import sys
while True:
    try:
        num=int(sys.stdin.readline())
        nums=map(int,sys.stdin.readline().split())
        if len(nums)==0 or len(nums)==1:
            print 0
        else:
            nums1=[[nums[0],1]]
            for i in range(1,num):
                if nums[i]!=nums[i-1]:
                    nums1.append([nums[i],1])
                else:
                    nums1[-1][1]+=1
            if len(nums1)==1:
                print nums1[0][1]*(nums1[0][1]-1)/2
            else:
                ans=[]
                result=0
                i=0
                while i<len(nums1):
                    if len(ans)>0:
                        if nums1[i][0]<ans[-1][0]:
                            ans.append([nums1[i][0],nums1[i][1]])
                            i+=1
                        elif nums1[i][0]>ans[-1][0]:
                            result+=ans[-1][1]*(ans[-1][1]-1)/2+2*ans[-1][1]
                            ans.pop()
                        else:
                            ans[-1][1]+=nums1[i][1]
                            i+=1
                    else:
                        ans.append([nums1[i][0],nums1[i][1]])
                        i+=1
                    if i==len(nums1):
                        while len(ans)>2: 
                            result+=ans[-1][1]*(ans[-1][1]-1)/2+2*ans[-1][1]
                            ans.pop()
                        if len(ans)==2:
                            result+=ans[-1][1]*(ans[-1][1]-1)/2+ans[-2][1]*ans[-1][1]
                            ans.pop()
                        if len(ans)==1:
                            result+=ans[-1][1]*(ans[-1][1]-1)/2
                print result

    except:
        break

按照左神的代碼改了一下,還是90%

#coding=utf-8
import sys
def nextIndex(num,i):
    if i<num-1:
        return i+1
    return 0
def getInternalSum(n):
    return n*(n-1)/2

while True:
    try:
        num=int(sys.stdin.readline())
        nums=map(int,sys.stdin.readline().split())
        if num<2:
            print 0
        else:
            maxIndex=0
            for i in range(num):
                if nums[maxIndex]<nums[i]: #記錄最高山峯的下標
                    maxIndex=i
            value=nums[maxIndex]
            index=nextIndex(num,maxIndex) #移到最高山峯下標的下一個
            res=0
            stack=[]
            stack.append([value,1])
            while index!=maxIndex:
                value=nums[index]
                while len(stack)>0 and stack[-1][0]<value: #如果棧頂元素小於當前元素
                    times=stack[-1][1]
                    stack.pop()
                    res+=getInternalSum(times)+times
                    if len(stack)>0:
                        res+=times
                if len(stack)>0 and stack[-1][0]==value: #棧頂元素和當前元素相當,+1
                    stack[-1][1]+=1
                else:
                    stack.append([value,1])
                index=nextIndex(num,index)
            while len(stack)>0:
                times=stack[-1][1]
                stack.pop()
                res+=getInternalSum(times)
                if len(stack)>0:
                    res+=times
                    if len(stack)>1:
                        res+=times
                    else:
                        if stack[-1][1]>1:
                            res+=times
            print res


    except:
        break

進制均值

儘管是一個CS專業的學生,小B的數學基礎很好並對數值計算有着特別的興趣,喜歡用計算機程序來解決數學問題,現在,她正在玩一個數值變換的遊戲。她發現計算機中經常用不同的進製表示一個數,如十進制數123表達爲16進制時只包含兩位數7、11(B),用八進制表示爲三位數1、7、3,按不同進製表達時,各個位數的和也不同,如上述例子中十六進制和八進制中各位數的和分別是18和11,。 小B感興趣的是,一個數A如果按2到A-1進製表達時,各個位數之和的均值是多少?她希望你能幫她解決這個問題? 所有的計算均基於十進制進行,結果也用十進制表示爲不可約簡的分數形式。
輸入描述:

輸入中有多組測試數據,每組測試數據爲一個整數A(1 ≤ A ≤ 5000).

輸出描述:

對每組測試數據,在單獨的行中以X/Y的形式輸出結果。
示例1
輸入

5
3
輸出

7/3
2/1

#coding=utf-8
import sys


while True:
    try:
        num=input()
        res=0
        for i in range(2,num):
            temp=0
            num1=num
            while num1>=i:
                temp+=num1%i
                num1/=i
            temp+=num1
            res+=temp
        a=res;b=num-2
        while b!=0:
            t=a%b
            a=b
            b=t
        print str(res/a)+'/'+str((num-2)/a)
    except:
        break

幸運數

小明同學學習了不同的進制之後,拿起了一些數字做起了遊戲。小明同學知道,在日常生活中我們最常用的是十進制數,而在計算機中,二進制數也很常用。現在對於一個數字x,小明同學定義出了兩個函數f(x)和g(x)。 f(x)表示把x這個數用十進制寫出後各個數位上的數字之和。如f(123)=1+2+3=6。 g(x)表示把x這個數用二進制寫出後各個數位上的數字之和。如123的二進制表示爲1111011,那麼,g(123)=1+1+1+1+0+1+1=6。 小明同學發現對於一些正整數x滿足f(x)=g(x),他把這種數稱爲幸運數,現在他想知道,小於等於n的幸運數有多少個?
輸入描述:

每組數據輸入一個數n(n<=100000)

輸出描述:

每組數據輸出一行,小於等於n的幸運數個數。
示例1
輸入

21
輸出

3

#coding=utf-8
import sys

def f(n):
    res=0
    while n>0:
        res+=n%10
        n/=10
    return res

def g(n):
    b=str(bin(n))
    return b.count('1')

while True:
    try:
        num=input()
        res=0
        for i in range(1,num+1):
            if f(i)==g(i):
                res+=1
        print res

    except:
        break

集合

給你兩個集合,要求{A} + {B}。 注:同一個集合中不會有兩個相同的元素。
輸入描述:

每組輸入數據分爲三行,第一行有兩個數字n,m(0 ≤ n,m ≤ 10000),分別表示集合A和集合B的元素個數。後兩行分別表示集合A和集合B。每個元素爲不超過int範圍的整數,每個元素之間有個空格隔開。

輸出描述:

針對每組數據輸出一行數據,表示合併後的集合,要求從小到大輸出,每個元素之間有一個空格隔開,行末無空格。
示例1
輸入

3 3
1 3 5
2 4 6
輸出

1 2 3 4 5 6
想用合併排序,結果出問題了。。。。。
就直接最簡的了

#coding=utf-8
import sys

while True:
    try:
       num=sys.stdin.readline().split()
       n,m=int(num[0]),int(num[1])
       ns=map(int,sys.stdin.readline().split())
       ms=map(int,sys.stdin.readline().split())
       res=list(set(ns).union(set(ms)))
       res.sort()
       print ' '.join(map(str,res))
    except:
        break
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章