1、跳台階
有一樓梯共m級,剛開始時你在第一級,若每次只能跨上一級或二級,要走上第m級,共有多少走法?
注:規定從一級到一級有0種走法。
#include<iostream> #include<vector> using namespace std; int main(){ int k; cin >> k; int n; while(k--)>0) { cin >> n; if(n==1) { cout << 0 << endl; continue; } vector<int> steps(n,1); for(int i=2;i<n;i++) { steps[i] = steps[i-1] + steps[i-2]; } cout << steps[n-1] << endl; } } #include<iostream> using namespace std; int main() { int n; cin>>n; int a[41]={0}; a[1]=1; a[2]=1; for(int i=3;i<=40;i++) a[i]=a[i-1]+a[i-2]; while(n--) { int num; cin>>num; cout<<a[num]<<endl; } }
2、擊鼓傳花
聰明的小賽提出一個有趣的問題:有多少種不同的方法可以使得從小賽手里開始傳的花,傳了m次以后,又回到小賽手里。對於傳遞的方法當且僅當這兩種方法中,接到花的同學按接球順序組成的序列是不同的,才視作兩種傳花的方法不同。比如有3個同學1號、2號、3號,並假設小賽為1號,花傳了3次回到小賽手里的方式有1->2->3->1和1->3->2->1,共2種。
輸入:輸入共一行,有兩個用空格隔開的整數n,m(3<=n<=30,1<=m<=30)
輸出:輸出共一行,有一個整數,表示符合題意的方法數
#include<iostream> #include<vector> using namespace std; int main() { int n, m; cin >> n >> m; vector<vector<int> > A(2, vector<int>(n)); A[0][0] = 1; for (int i = 1; i < n; i++) A[0][i] = 0; int p = 1; for (int i = 1; i <= m; i++,p=1-p) { for (int j = 0; j < n; j++) { A[p][j] = A[1 - p][(j - 1 + n) % n] + A[1 - p][(j + 1) % n];//DP的遞推方程 } } cout << A[1-p][0] << endl; return 0; }
3、股神
經過嚴密的計算,小賽買了一支股票,他知道從他買股票的那天開始,股票會有以下變化:第一天不變,以后漲一天,跌一天,漲兩天,跌一天,漲三天,跌一天...依此類推。
為方便計算,假設每次漲和跌皆為1,股票初始單價也為1,請計算買股票的第n天每股股票值多少錢?
#include <iostream> using namespace std; int GetValue(int n) { int i = 0;// i統計遇到了多少次下跌 int j = 2;// 每次下跌之后上漲的天數,包含已經下跌的那天 int k = n; while (k > j) { i += 2; k -= j; ++j; } return n - i; } int main() { int n; while (cin >> n) { cout << GetValue(n) << endl; } return 0; }
4、約德爾測試
說起約德爾人的未來,黑默丁格曾經提出了一個約德爾測試,將約德爾人的歷史的每個階段都用一個字符表達出來。(包括可寫字符,不包括空格。)。然后將這個字符串轉化為一個01串。轉化規則是如果這個字符如果是字母或者數字,這個字符變為1,其它變為0。然后將這個01串和黑默丁格觀測星空得到的01串做比較,得到一個相似率。相似率越高,則約德爾的未來越光明。
請問:相似率為多少?
輸入:每組輸入數據為兩行,第一行為有關約德爾人歷史的字符串,第二行是黑默丁格觀測星空得到的字符串。(兩個字符串的長度相等,字符串長度不小於1且不超過1000。)
輸出:輸出一行,在這一行輸出相似率。用百分數表示。(相似率為相同字符的個數/總個數,精確到百分號小數點后兩位。printf("%%");輸出一個%。)
#include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<algorithm> #include<string> using namespace std; string a,b; bool isAlph(char &c) { return ((c>='a'&&c<='z')||(c>='A'&&c<='Z')); } bool isNum(char &c) { return (c>='0'&&c<='9'); } bool isOne(char &c) { return (isAlph(c)||isNum(c)); } int main () { cin>>a>>b; int l = a.length(); int cnt = 0; for(int i=0;i<l;++i) { if(isOne(a[i])^(b[i]=='1')) continue; ++cnt; } double ans = cnt*100.0/l; printf("%.2lf%%\n", ans); }
5、路燈
V先生有一天工作到很晚,回家的時候要穿過一條長l的筆直的街道,這條街道上有n個路燈。假設這條街起點為0,終點為l,第i個路燈坐標為ai。路燈發光能力以正數d來衡量,其中d表示路燈能夠照亮的街道上的點與路燈的最遠距離,所有路燈發光能力相同。為了讓V先生看清回家的路,路燈必須照亮整條街道,又為了節省電力希望找到最小的d是多少?
輸入:兩行數據,第一行是兩個整數:路燈數目n (1≤n≤1000),街道長度l (1 ≤l≤109)。第二行有n個整數ai (0 ≤ ai≤ l),表示路燈坐標,多個路燈可以在同一個點,也可以安放在終點位置。
輸出:能夠照亮整個街道的最小d,保留兩位小數。
#include <iostream> #include <string> #include <iomanip> #include <algorithm> #include <functional> using namespace std; //主程序 int main() { cout << setiosflags(ios::fixed) << setprecision(2); int n; int l; int a[1000]; while (cin >> n >> l) { for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a + n, greater<int>()); double d = 0; for (int i = 0; i < n - 1; i++) { d = max(d, (a[i] - a[i + 1]) / 2.0); } d = max(d, (l - a[0]) / 1.0); d = max(d, a[n - 1] / 1.0); cout << d << endl; } return 0; }
6、翻轉數組
給定一個長度為n的整數數組a,元素均不相同,問數組是否存在這樣一個片段,只將該片段翻轉就可以使整個數組升序排列。其中數組片段[l,r]表示序列a[l], a[l+1], ..., a[r]。原始數組為
a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ..., a[r-1], a[r], a[r+1], a[r+2], ..., a[n-1], a[n],
將片段[l,r]反序后的數組是
a[1], a[2], ..., a[l-2], a[l-1], a[r], a[r-1], ..., a[l+1], a[l], a[r+1], a[r+2], ..., a[n-1], a[n]。
#include <iostream> #include <algorithm> using namespace std; int main() { int n; scanf("%d", &n); int arr[n]; int sortArr[n]; for(int i = 0; i < n; i++){ scanf("%d", &arr[i]); sortArr[i]=arr[i]; } sort(sortArr, sortArr + n); int start = 0, end = n - 1; while(start < n && arr[start] == sortArr[start])start++; while(end >= 0 && arr[end] == sortArr[end])end--; bool ok = true; while(start < end){ if(sortArr[start] != arr[end]){ ok = false; break; } start++, end--; } if(ok) printf("yes\n"); else printf("no\n"); return 0; }