南大 计算机 机试
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;
}