牛客春招刷题训练营 - 3.11题解 | C++

活动地址: 牛客春招刷题训练营 - 编程打卡活动

简单题:字符串分隔

可以考虑一个字符一个字符地输出,,每输出8个字符就输出一个回车。这一点可以用一个累加器来实现,累加器是8的倍数的时候就输出回车。

最后累加器如果不是8的倍数,就输出0,直到变为8的倍数。

#include <iostream>
using namespace std;

int main() {
    string s;
    cin >> s;
    int tot = 0;
    for(char c: s) {
        cout << c;
        tot ++;
        if(tot % 8 == 0) {
            cout << endl;
        }
    }
    while(tot % 8 != 0) {
        cout << 0;
        tot ++;
    }
    return 0;
}

中等题:质数因子

分解质因数的模板,准备春招的uu们可以记一下。

复杂度是O(√N)

#include <iostream>
#include <vector>
using namespace std;
vector<pair<int, int>> div(int n)
{
	vector<pair<int, int>> res;
	for(int i=2; i<=n/i; i++)
	if(n%i == 0) {
		int cnt = 0;
		while(n%i == 0) n/=i, cnt++;
		res.emplace_back(i, cnt);
	}
	if(n > 1) res.emplace_back(n, 1);
	return res;
}
int main() {
    int n;
    cin >>n;
    auto d = div(n);
    for(auto [x, y]: d)
        for(int i=1; i<=y; i++)
            cout << x << " ";
  	return 0;
}

困难题:合唱队

最长上升子序列DP模型

要使得出列的同学最少,就要找一个最长的^形序列。

我们用 up[i] 记录以 a[i] 结尾的最长上升子序列,down[i] 记录以 a[i] 开头的最长下降子序列。

最后打一遍擂台,求出max{up[i] + down[i]}就是答案。

然后查看题目n的范围是 [1, 3000],用N^2复杂度的求法求最长上升子序列即可。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int> a(n+1);
    for(int i=1; i<=n; i++)
        cin >> a[i];
    vector<int> up(n+1, 1), down(n+1, 1);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<i; j++) {
            if(a[j] < a[i]) {
                up[i] = max(up[i], up[j]+1);
            }
        }
    }
    for(int i=n; i>=1; i--) {
        for(int j=i+1; j<=n; j++) {
            if(a[j] < a[i]) {
                down[i] = max(down[i], down[j]+1);
            }
        }
    }
    int res = 0;
    for(int i=1; i<=n; i++) {
        res = max(res, up[i]+down[i]-1);
    }
    cout << n - res << endl;
    return 0;
}

#牛客春招刷题训练营#
全部评论

相关推荐

评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务