(白書訓練計劃)UVa 120 Stacks of Flapjacks(構造法),stacksflapjacks
題目地址:UVa 120
水題。從最大的開始移,每次都把大的先翻到最上面,再翻到下面。
代碼如下:
#include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <queue>#include <map>#include <set>#include <algorithm>using namespace std;int a[500], b[500], d[500];int main(){ int i, j, flag, cnt, n, x, m; while(scanf("%d",&a[0])!=EOF) { b[a[0]]=0; d[0]=a[0]; i=1; cnt=0; while(getchar()!='\n') { scanf("%d",&a[i]); d[i]=a[i]; b[a[i]]=i; i++; } n=i; m=n; for(i=0; i<n; i++) { printf("%d",a[i]); if(i!=n-1) printf(" "); } printf("\n"); sort(d,d+n); while(n--) { if(b[d[n]]==n) continue ; if(b[d[n]]!=0) { x=b[d[n]]; printf("%d ",m-x); for(i=0; i<=x; i++) { b[a[i]]=x-b[a[i]]; } for(i=0; i<=x/2; i++) { int t=a[i]; a[i]=a[x-i]; a[x-i]=t; } } for(i=0; i<=n; i++) { b[a[i]]=n-b[a[i]]; } for(i=0; i<=n/2; i++) { int t=a[i]; a[i]=a[n-i]; a[n-i]=t; } printf("%d ",m-n); } printf("0\n"); } return 0;}
Stacks of Flapjacks: python編程問題(看好了是python,不是C++)
ACM ?
思路如下:
比如有5個:15243
1、判斷最大的數(5)在第幾個(2)。 (很遺憾list沒有find或者getitem方法,得寫一個小函數,2、3行)
2、從刀插進去,將該數放到頂 13425 (get slice方法)
3、刀從第一個插,該數到底 52431 (用 list.reverse())
4、判斷第二大的數(4)在第幾個,重複2~3,最後得到54321…… (一開始是一個迴圈,for i in range(len(list),0,-1))
現在系統沒有python……明天看看能不能把程式寫出來……
===============================11月23日更新 18:47==================
吼吼!下了個pythonportable~ 可以隨時py了
修正一下,list有index這個方法……
程式如下:
def analyze(Mylist):
sequence=[] #初始化排序方法
for i in range(len(Mylist),0,-1): #逆序將餅排到底
if Mylist[len(Mylist)-i] == i :
pass #如果第i各就是i的話就不排序跳到下一個數
else :
sequence.append(Mylist.index(i)+1) #記錄下翻轉方法,python從0開始而本題中從1開始
print "sequence = ",sequence
tempslice=Mylist[Mylist.index(i):] #取出後部分,即從數為I處切
tempslice.reverse() #翻轉
Mylist[-len(tempslice):]=tempslice
print Mylist
sequence.append(len(Mylist)-i)
print "sequence = ",sequence
tempslice=Mylist[len(Mylist)-i:]
tempslice.reverse() #翻轉
Mylist[-len(tempslice):]=tempslice
&n......餘下全文>>
Stacks of Flapjacks 是python的 不是C++
俺倒要瞧瞧是否真有人能看懂...