牛客网模拟笔试 2

时间:2022-12-16 22:45:19

https://www.nowcoder.com/discuss/22561

这是牛客网上的官方题解。

1.平衡树,显然小于10的数字不是平衡数,然后把数拆分成个位数,逐个判断是否满足要求。

牛客网模拟笔试 2牛客网模拟笔试 2
 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,最后输出个数即可。

牛客网模拟笔试 2牛客网模拟笔试 2
 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还是很明显的。

牛客网模拟笔试 2牛客网模拟笔试 2
 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生成的字符是否是满足优美的条件,然后采用排列组合的知识进行计算。这个实在是想不出来。

牛客网模拟笔试 2牛客网模拟笔试 2
 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

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

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