google code jam exercise——Store Credit

來源:互聯網
上載者:User

最近瞭解到Google Code Jam這件事情,一個編程競賽項目,登入之後可以看到以前的題目,覺得都很有意思,於是想嘗試一下。

我看到的第一題是Store Credit,大概意思就是給你一定數額的錢,然後給你一個物品價格清單,選擇兩個物品,正好花完所有的錢。具體內容可以參考http://code.google.com/codejam/contest/351101/dashboard#s=p0

因為要求正好花完所有的錢,貪心演算法就不太管用了,還好只是要求選擇兩個物品,直接的方法就是遍曆搜尋了。確定一個物品,尋找另一個價格滿足要求的物品。在遍曆搜尋中,也有一些地方可以減少搜尋次數。

比如,順序遍曆物品,選定一個物品之後,只需要在剩餘的物品中遍曆尋找。

再比如,先將物品按價格排序,可以將價格等於大於總錢數的物品排除在搜尋範圍之外。需要注意的是,排序的時候需要記錄物品對應的順序,因為它要求輸出物品的原始序號。

確定了這些,開始寫程式了。學習了那麼久的Python,幾乎還沒有正式寫過程式,所以決定用Python來實現。

先是排序的函數,使用快速排序演算法,

參考http://en.wikipedia.org/wiki/Quicksort,那裡Python寫的程式很簡單,但是沒有記錄原始序號,還是得自己寫一個。

代碼如下,

#!/usr/bin/python
#encoding:UTF-8
#Filename:QuickSort.py

def partition(A,B,p,r):
x = A[r]
i = p-1
for j in range(p,r):
if A[j]<=x:
i = i + 1
A[i],A[j] = A[j],A[i]
B[i],B[j] = B[j],B[i]
A[i+1],A[r] = A[r],A[i+1]
B[i+1],B[r] = B[r],B[i+1]
return i+1

def quickSort(A,B,p,r):
if p<r:
q = partition(A,B,p,r)
quickSort(A,B,p,q-1)
quickSort(A,B,q+1,r)

在排序之後,尋找使用的是二分尋找,

代碼如下,

#!/usr/bin/python
#encoding:UTF-8
#Filename:BinarySearch.py

def binarySearch(A,x,lo,hi):
res = -1
while(lo<=hi):
mid = (lo+hi) / 2
if x==A[mid]:
res = mid
break
elif x<A[mid]:
hi = mid - 1
else:
lo = mid + 1
return res

然後寫了一個solver程式,一種是直接搜尋,另一種是先排序後搜尋,

代碼如下,

#!/usr/bin/python
#encoding:UTF-8
#Filename:CreditSolver.py

import QuickSort
import BinarySearch


def creditSolverDirect(m,l,p):
an = [0,0]
for i in range(l-1):
for j in range(i+1,l):
if p[i]+p[j]==m:
an = [i+1,j+1]
return an
return an

def creditSolverSort(m,l,p):
an = [0,0]
pa = p;
pb = range(0,l)
QuickSort.quickSort(pa,pb,0,l-1)
i = 0;
for price in pa:
i = i+1
if price < m:
res = BinarySearch.binarySearch(pa,m-price,i,l-1)
if res!=-1:
an = [pb[i-1],pb[res]]
break
if an[0]>an[1]:
an[0],an[1] = an[1],an[0]
an = [an[0]+1,an[1]+1]
return an

最後就是主程式,讀取輸入,解題,輸出寫入檔案,

代碼如下,

#!/usr/bin/python
#Filename: StoreCredit.py

import CreditSolver

# read file

linenum = 0;
testCaseNum = 0;
caseLines = 3;
fin = open("input.txt")
fout = open("output.txt","w")
# to process first line, test case number
line = fin.readline()
if not line:
print "failed to open input.txt"
linenum = linenum + 1

testCaseNum = int(line)

#print "test cases number:%d" %(testCaseNum)

for i in range(testCaseNum):
money = int(fin.readline())
items = int(fin.readline())
priceStr = fin.readline().split(" ");
price = [int(stri) for stri in priceStr]
# print "--- to solve case %d ---" %(i)
# print "money:%d" %(money)
# print "items:%d" %(items)
# print "price:"
# print price
L = [0,0]
if items > 128:
L = CreditSolver.creditSolverSort(money,items,price)
else:
L = CreditSolver.creditSolverDirect(money,items,price)
answer = ""
if L[1]!=0:
answer = "Case #" + str(i) + ": " + str(L[0]) + " " + str(L[1]) + "\n"
else:
answer = "Case #" + str(i) + ": x\n"
fout.write(answer)

#print "done!"
fin.close()
fout.close()

對於題目中給的測試情況,輸出是正確的,沒有測試過更大的例子,不知道是否會出現異常,或者效能很差。如果誰發現了問題,希望能告訴我,大家也可以一起改進解題過程和程式的實現。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.