南京大学_计算机系_夏令营_机试

南大 计算机 机试

1. 输入一串数字,移除 k 个数字,数字相对位置不变,使得剩下的数字组成最小的数

输入:

12321

3

输出:

11

输入:

12

1

输出:

1

/**
 * 思路:最长上升子序列的变种
 *      每遍历到字符串中的字符,若存在比当前字符大的字符,则删除之
 *      直到删除的个数已为k 或遍历到了 最后一个字符为止
 * 
*/

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int main() {

    string num;
    int k;
    cin >> num >> k;
    if(k == 0) {
        cout << num;
        return 0;
    }

    int len = num.length();
    int finalLen = len - k;
    if(finalLen <= 0) {
        cout << "";
        return 0;
    }
    int flag[len];
    memset(flag,0,sizeof(flag));

    int i = 1;
    int j = 0;
    // 有可能存在 12345 这种删除字符数目不够k 的情况
    // 则将前 len - k 个 字符打印之
    while(i < len && k > 0) {

        int a = num[i] - '0';
        for(int j = 0;j < i;j++) {
            int b = num[j] - '0';
            if(a < b && flag[j] == 0) {
                flag[j] = 1;
                k--;
                if(k == 0) {
                    break;
                }
            }
        }
        i++;
    }

    for(int i = 0;i < len;i++) {
        if(flag[i] == 0 && finalLen > 0) {
            cout << num[i];
            finalLen--;
        }
    }

    return 0;
}

2. 有 n 个男孩, m 个女孩,他们站一排,要求 至多 K 个男孩相邻,问有多少种解法,结果最后还要 取 1007 的模

BOY1 BOY2 GIRL1 GIRL2

BOY2 BOY1 GIRL2 GIRL1

是同一种解法

输入:

3 1 2

输出:

2

3. 给定 前序 和 后序 遍历的 二叉树字符串,给出所有可能的二叉树数目

输入

abc

cba

输出

4

#include <iostream>
#include <string>
#include <cmath>
using namespace std;

int main(void) {

    string preStr;
    string postStr;

    cin >> preStr >> postStr;
    int count = 0;
    int len = preStr.size();
    for(int i = 0;i < len;i++) {
        for(int j = 1;j < len;j++) {
            if(preStr[i] == postStr[j] && preStr[i + 1] == postStr[j - 1]) {
                count++;
            }
        }
    }

    cout << pow(2,count) << endl;
    return 0;
}
发布了51 篇原创文章 · 获赞 27 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_39446719/article/details/95781253
今日推荐