思路:
给的样例不由得让人想到开根号上去,这题意思是每次把每一位加起来得到一个和,得到和之后再把这个和的每一位加起来,直到这个和只有个位数。
这东西叫数根。有关于他的性质和公式:
公式:(n - 1) % 9 + 1
性质:一个数加上9之后他的数根不变
不用公式做法:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <vector> #include <map> #include <unordered_set> #include <unordered_map> #define x first #define y second #define IOS ios::sync_with_stdio(false);cin.tie(0); using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010; const double PI = acos(-1); int a[N]; int solve(int n) { int tmp = 0; while(n) { tmp += n % 10; n /= 10; } return tmp; } int main() { IOS; int n; cin >> n; while(n / 10)//直到n只剩一位 n = slove(n); cout << n << endl; return 0; }
公式:
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <vector> #include <map> #include <unordered_set> #include <unordered_map> #define x first #define y second #define IOS ios::sync_with_stdio(false);cin.tie(0); using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010; const double PI = acos(-1); int a[N]; int main() { IOS; int n; cin >> n; cout << (n - 1) % 9 + 1 << endl; return 0; }
思路:
从题目名字能直到是让我们判断一个单词是不是斐波那契单词,类似于斐波那契数列,先把每个字母转化成0~25的数字,然后从第三位开始判断每一位是不是前两位的和就可以了,但要注意,由于每个字母都小于26,然后从ANNA这个样例我们能看出来,加完之后还要模26
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <vector> #include <map> #include <unordered_set> #include <unordered_map> #define x first #define y second #define IOS ios::sync_with_stdio(false);cin.tie(0); using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 200010; const double PI = acos(-1); int a[N]; int main() { string s; cin >> s; bool flag = true; for (int i = 2; i < s.size(); i ++ ) if(s[i] - 'A' != (s[i - 1] - 'A' + s[i - 2] - 'A') % 26) { flag = false; break; } if (flag) cout << "YES" << endl; else cout << "NO" << endl; return 0; } // help // 7 4 11 15 // a b c d e f g h i j k l m n o p q r s t u v w x y z
思路:
乍一看是搜索,但最后给了个条件瞬间变贪心,首先老鼠要吃最短的,这里的最短路程是用的哈夫曼距离,然后如果路程相同,就优先吃行号较小的,可以用一个结构体存所有为星号的点,记录横纵坐标和哈夫曼距离,然后重载小于号排序,然后按只能走右下的条件遍历这个集合并记录答案
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> #include <queue> #include <stack> #include <set> #include <vector> #include <map> #include <unordered_set> #include <unordered_map> #define x first #define y second #define IOS ios::sync_with_stdio(false);cin.tie(0); using namespace std; typedef long long LL; typedef pair<int, int> PII; const int N = 10; const double PI = acos(-1); char g[N][N]; struct Node{ int x, y, dist; bool operator< (const Node &t) const { if(dist == t.dist) return x < t.x; else return dist < t.dist; } } tmp[N * N]; int main() { int n, m; cin >> n >> m; int e = 0; for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= m; j ++ ) { cin >> g[i][j]; if(g[i][j] == '*') tmp[++e] = {i, j, i - 1 + j - 1}; } sort(tmp + 1, tmp + 1 + e); int res = 0; auto now = tmp[0]; for (int i = 1; i <= e; i ++ ) { if(tmp[i].y >= now.y && tmp[i].x >= now.x)//只能走右下 { res++; now = tmp[i]; } } cout << res << endl; return 0; }