zoukankan      html  css  js  c++  java
  • 牛客网模拟笔试 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

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

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

  • 相关阅读:
    windows命令提示符常用命令
    JAVA中定义不同进制整数
    进制转换
    win10配置jdk环境变量
    AI Gossip
    搜狗大数据总监、Polarr 联合创始人关于深度学习的分享交流 | 架构师小组交流会
    后端渲染实践——看掘金社区是如何实践的
    谢孟军:The State of Go | ECUG Con 精粹系列
    让你的 CDN 费用省 50% 以上!图片瘦身的正确姿势
    七牛云大数据平台建设实践
  • 原文地址:https://www.cnblogs.com/y119777/p/6656313.html
Copyright © 2011-2022 走看看