21-22-1蓝桥训练1
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21-22-1蓝桥训练1相关的知识,希望对你有一定的参考价值。
除了 D题矩阵翻转 暴力解法没过,然后就没有然后了,其余都写出来了。。。9.25号的LC秋季赛给我整自闭了,十分钟内签到题后,之后几个小时就再没进展了🤦♂️
A题:质因数
#include<bits/stdc++.h>
using namespace std;
int N;
bool isPrim() {
for (int i = 2; i * i <= N; i++) {
if (N % i == 0)
return false;
}
return true;
}
void solve() {
ios::sync_with_stdio(false);
cin >> N;
cout << N << "=";
if (isPrim()) {
cout << N;
return ;
}
for (int i = 2; i <= N; i++) {
int t = i;
while (N % t == 0) {
N /= t;
if (N != 1) {
cout << t << "*";
}
}
if (N == 1) {
cout << t;
break;
}
}
}
int main() {
solve();
return 0;
}
B题:项链
利用substr()暴力解就行。。
#include<bits/stdc++.h>
using namespace std;
string s;
int res = INT_MIN;
int handle(string t){
if(t=="") return 0;
int cnt = 1;
int pos = 0;
while(pos < t.length()&&t[pos]=='w'){pos++;cnt++;}//pre_handle
for(int i=pos+1;i<t.length();i++){
if(t[i]==t[i-1]){
cnt++;
}
else if(t[i]=='w'){
t[i] = t[i-1];
cnt++;
}else{
break;
}
}
return cnt;
}
void solve(){
ios::sync_with_stdio(false);
cin>>s;
for(int i=0;i<s.length();i++){
string t = s.substr(i,s.length()-i)+s.substr(0,i);
int sum=0;
int comsum1 = handle(t); //第一次拿到的长度
sum+=comsum1;
reverse(t.begin(),t.end());
sum+=handle(t.substr(0,t.length()-comsum1));
res = max(res,sum);
}
cout<<res;
}
int main() {
solve();
return 0;
}
C题:校门外的树
这个数据量小,如果数据量大一点推荐用差分数组实现。
#include<bits/stdc++.h>
using namespace std;
int* roads;
bool* check;
int L,M;
void solve(){
ios::sync_with_stdio(false);
cin>>L>>M;
roads = new int[L+1];
check = new bool[L+1];
fill(check,check+L+1,0);
fill(roads,roads+L+1,1);
int m = M;
while(m--){
int a,b;cin>>a>>b;//直接更新数组
for(int i=a;i<=b;i++){
if(!check[i]) {
roads[i]--;
check[i] = 1;
}
}
}
cout<<accumulate(roads,roads+L+1,0);
}
int main() {
solve();
return 0;
}
D题:矩阵翻转(没写)
E题:聪明的美食家
这题是真滴坑!开始以为只是一个简单的贪心,没想到只是一个LIS,确定为LIS后,还一定要注意:相同大小的美味度也算!
- 这是二分的LIS实现
关于这个实现可以看我之前的讲解LIS二分详解
#include<bits/stdc++.h>
using namespace std;
int N;
int lengthOfLIS(vector<int>& nums) {
vector<int>dp(nums.size(), 0);
int end = 1;
dp[0] = nums[0];
//寻找上边界的二分,我选择的是左闭右开的方式,注意和普通LIS最大的区别在于相同的大小也算
for (int i = 1; i < nums.size(); i++) {
int l = 0, r = end;
int target = nums[i];
while (l < r) {
int mid = (l + r) / 2;
if (dp[mid] > target)
r = mid;
else {
l = mid + 1;
}
}
dp[l] = target;
//注意更新右边界
if (l == end)
end++;
}
return end;
}
void solve() {
ios::sync_with_stdio(false);
cin >> N;
vector<int>nums(N);
for (int i = 0; i < N; i++) {
cin >> nums[i];
}
cout<<lengthOfLIS(nums);
}
int main() {
solve();
return 0;
}
F题:Torry的困惑(基本型)
嗯。。怎么说呢,只要会用质数筛的,应该这题都能秒吧。。。
#include<bits/stdc++.h>
using namespace std;
#define MaxN 10000000
#define MOD 50000
bool* IsPrime;
int N;
void update() { //更新质数筛
IsPrime[0] = IsPrime[1] = false;
for (int i = 2; i * i <= MaxN; i++) {
if (IsPrime[i]) {
int j=i,k = i;
while (j*k<MaxN){
IsPrime[j*k] = false;
k++;
}
}
}
}
void init() {
ios::sync_with_stdio(false);
cin >> N;
IsPrime = new bool[MaxN];
fill(IsPrime, IsPrime + MaxN, true);
update();
}
void print(){
int cnt = 0;
int res = 1;
for(int i=2;i<MaxN;i++){
if(IsPrime[i]){
res = (res*i)%MOD;
cnt++;
}
if(cnt==N)
break;
}
cout<<res;
}
int main() {
init();
print();
return 0;
}
总结
给我最大的困惑在于蓝桥杯题目的描述。。。比如美食家那题。。。
以上是关于21-22-1蓝桥训练1的主要内容,如果未能解决你的问题,请参考以下文章