牛客网模拟笔试 2

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 }
View Code

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 }
View Code

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 }
View Code

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 }
View Code

其他的二模题目没有看,有时间做一下。

下面是一模的题目。好像之前总结过了,这里就不写了。好像也有一模的所有题目总结,也是没做完,有时间做完总结一下。

原文地址:https://www.cnblogs.com/y119777/p/6656313.html