https://www.nowcoder.com/discuss/22561
这是牛客网上的官方题解。
1.平衡树,显然小于10的数字不是平衡数,然后把数拆分成个位数,逐个判断是否满足要求。
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 1e3 + 10; 14 int a[20]; 15 void yes() { 16 cout << "YES" << endl; 17 } 18 void no() { 19 cout << "NO" << endl; 20 } 21 void solve() { 22 ll x; 23 while(cin >> x){ 24 //cout << "asd " << x << endl; 25 int p = 0; 26 if(x < 10) { 27 no(); 28 continue; 29 } 30 while(x > 0) { 31 a[p++] = x % 10; 32 x /= 10; 33 } 34 bool f = 0; 35 for (int i = 0; i < p - 1; i++) { 36 int left = 1, right = 1; 37 for (int j = 0; j <= i; j++) 38 left *= a[j]; 39 for (int j = i + 1; j < p; j++) 40 right *= a[j]; 41 if(left == right) { 42 yes(); 43 f = 1; 44 break; 45 } 46 if(f) break; 47 } 48 if(f) continue; 49 no(); 50 } 51 } 52 int main() { 53 freopen("test.in", "r", stdin); 54 //freopen("test.out", "w", stdout); 55 //ios::sync_with_stdio(0); 56 //cin.tie(0); cout.tie(0); 57 solve(); 58 return 0; 59 }
2. 字符串分类
直接排序,放入set,最后输出个数即可。
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 1e3 + 10; 14 int n; 15 set<string> ma; 16 void solve() { 17 string s; 18 cin >> n; 19 while(n--) { 20 cin >> s; 21 sort(s.begin(), s.end()); 22 //cout << s << endl; 23 ma.insert(s); 24 } 25 cout << ma.size() << endl; 26 } 27 int main() { 28 freopen("test.in", "r", stdin); 29 //freopen("test.out", "w", stdout); 30 //ios::sync_with_stdio(0); 31 //cin.tie(0); cout.tie(0); 32 solve(); 33 return 0; 34 }
3. 创造新世界
01串,最多构成多少物品,leetcode原题,dp,01背包,代价为01的个数,价值为物品的个数。dp还是很明显的。
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 1e3 + 10; 14 int dp[510][510]; 15 int n, m; 16 int sz; 17 int a[30], b[30]; 18 void solve() { 19 cin >> sz >> n >> m; 20 string s; 21 int x, y; 22 for (int i = 0; i < sz; i++) { 23 cin >> s; 24 x = y = 0; 25 for (char t : s) { 26 if(t == '0') x++; 27 else y++; 28 } 29 a[i] = x; b[i] = y; 30 } 31 for (int k = 1; k <= sz; k++) { 32 for (int i = n; i >= a[k - 1]; i--) { 33 for (int j = m; j >= b[k - 1]; j--) { 34 dp[i][j] = max(dp[i][j], dp[i - a[k - 1] ][j - b[k - 1] ] + 1); 35 } 36 } 37 } 38 cout << dp[n][m] << endl; 39 } 40 int main() { 41 freopen("test.in", "r", stdin); 42 //freopen("test.out", "w", stdout); 43 //ios::sync_with_stdio(0); 44 //cin.tie(0); cout.tie(0); 45 solve(); 46 return 0; 47 }
4.优美的回文串
牛牛在书上看到一种字符串叫做回文串,当一个字符串从左到右和从右到左读都是一样的,就称这个字符串为回文串。牛牛又从好朋友羊羊那里了解到一种被称为优美的回文串的字符串,考虑一个长度为N只包含大写字母的字符串,写出它所有长度为M的连续子串(包含所有可能的起始位置的子串,相同的子串也要计入),如果这个字符串至少有K个子串都是回文串,我们就叫这个字符串为优美的回文串。现在给出一个N,牛牛希望你能帮他计算出长度为N的字符串有多少个是优美的回文串(每个位置都可以是'A'~'Z'的一个。)
这个题目还是比较变态的,根本没思路。没有好办法。答案是枚举+check。
好题,多看几遍,学习解决办法。
每个位置有26种方法,还要满足回文串的个数是k,怎么枚举都不行,那就是枚举所有的进行check,但是这个枚举数字实在是太大了,无法进了。
看题解,真是巧妙的方法,长度为a,至多使用a个字符,然后check生成的字符是否是满足优美的条件,然后采用排列组合的知识进行计算。这个实在是想不出来。
1 /* 2 ID: y1197771 3 PROG: test 4 LANG: C++ 5 */ 6 #include<bits/stdc++.h> 7 #define pb push_back 8 #define FOR(i, n) for (int i = 0; i < (int)n; ++i) 9 #define dbg(x) cout << #x << " at line " << __LINE__ << " is: " << x << endl 10 typedef long long ll; 11 using namespace std; 12 typedef pair<int, int> pii; 13 const int maxn = 1e3 + 10; 14 int n, m, k; 15 ll a[15]; 16 ll res; 17 char ch[20]; 18 void work(int cur, int p) { 19 //cout << cur << " " << p << endl; 20 if(cur == 0) { 21 int t = 0; 22 for (int i = 1; i <= n - m + 1; i++) { 23 bool f = 1; 24 for (int j = 0; j < m / 2; j++) { 25 if(ch[i + j] != ch[i + m - 1 - j]) { 26 f = 0; break; 27 } 28 } 29 t += f; 30 } 31 //cout << t << " asd " << endl; 32 if(t >= k) 33 res += a[p]; 34 return; 35 } 36 for (int i = 0; i < p + 1; i++) { 37 ch[cur] = 'a' + i; 38 work(cur - 1, max(p, i + 1)); 39 } 40 } 41 void solve() { 42 a[0] = 0; a[1] = 26; 43 for (int i = 2; i < 15; i++) { 44 a[i] = a[i - 1] * (26 - i + 1); 45 } 46 cin >> n >> m >> k; 47 work(n, 0); 48 cout << res << endl; 49 } 50 int main() { 51 freopen("test.in", "r", stdin); 52 //freopen("test.out", "w", stdout); 53 ios::sync_with_stdio(0); 54 cin.tie(0); cout.tie(0); 55 solve(); 56 return 0; 57 }
其他的二模题目没有看,有时间做一下。
下面是一模的题目。好像之前总结过了,这里就不写了。好像也有一模的所有题目总结,也是没做完,有时间做完总结一下。