每日一题

it2024-04-20  14

一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

f(1) = 1

f(2) = f(2-1) + f(2-2) //f(2-2) 表示2阶一次跳2阶的次数。

f(3) = f(3-1) + f(3-2) + f(3-3)

f(n) = f(n-1) + f(n-2) + f(n-3) + … + f(n-(n-1)) + f(n-n)

说明:

1)这里的f(n) 代表的是n个台阶有一次1,2,…n阶的 跳法数。

2)n = 1时,只有1种跳法,f(1) = 1

n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)

n = 3时,会有三种跳得方式,1阶、2阶、3阶,

那么就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3)

因此结论是f(3) = f(3-1)+f(3-2)+f(3-3)

n = n时,会有n中跳的方式,1阶、2阶…n阶,得出结论:

f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1)

由以上已经是一种结论,但是为了简单,我们可以继续简化:

f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-1)-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)

f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2) + f(n-1) = f(n-1) + f(n-1)

可以得出:

f(n) = 2*f(n-1)

class Solution { public: int jumpFloorII(int number) { if(number <= 0) return 0; int res = 1; for(int i = 1; i < number; ++i) { res *= 2; } return res; //return 1<<(number - 1); } };

小喵们很喜欢把自己装进容器里的(例如碗),但是要是碗的周长比喵的身长还短,它们就进不去了。

现在告诉你它们的身长,和碗的半径,请判断一下能否到碗里去。

输入描述: 输入有多组数据。

每组数据包含两个整数n (1≤n≤2^128) 和r (1≤r≤2^128),分别代表喵的身长和碗的半径。

圆周率使用3.14。

输出描述: 对应每一组数据,如果喵能装进碗里就输出“Yes”;否则输出“No”。 示例1 输入 6 1 7 1 9876543210 1234567890 输出 Yes No No 方法一:

#include <iostream> using namespace std; int main(){ double n,r; while(cin >> n >> r){ //周长:2*r*3.1415 //身长:n if(n > (2*r*3.1415)) cout<<"No"<<endl; else cout<<"Yes"<<endl; } return 0; }

题目本质考察大数计算 方法二:

#include <iostream> #include <string> using namespace std; string Area(string &s) { int slen = s.size(); string str1(slen + 3, 0); string str2 = "628"; int a = 0; for(int m = 2; m>=0 ;--m) for (int i = slen - 1,j = str1.size() + m -3; i >= 0; --i,--j) { str1[j] += (s[i] - '0')*(str2[m] - '0'); } for (int i = str1.size(); i >= 0; --i) { str1[i] += a; a = str1[i] / 10; str1[i] = str1[i] % 10 + '0'; } int index = 0; while (str1[index] == '0') ++index; return string(str1.begin() + index, str1.end() - 2); } int compare(string& s1, string &s2) { if (s1.size() != s2.size()) { return (s1.size() > s2.size() ? 1 : -1); } else { for (int i = 0; i < s1.size(); ++i) { if (s1[i] == s2[i]) continue; else return (s1[i] > s2[i] ? 1 : -1); } return 0; } } int main() { string s1, s2; while (cin >> s1 >> s2) { s2 = Area(s2); if (compare(s1, s2) == 1) cout << "No" << endl; else cout << "Yes" << endl; } return 0; }
最新回复(0)