三带一【算法赛】 - 蓝桥云课 (lanqiao.cn)
给定四个字符,判断是否其中有三个相同,另一个与他们不同
#include <bits/stdc++.h>
void solve()
{
std::string s;
std::cin>>s;
char a=s[0],b=s[1],c=s[2],d=s[3];
if(a==b&&a==c&&a!=d) std::cout<<"Yes"<<'\n';
else if(a==b&&a==d&&a!=c) std::cout<<"Yes"<<'\n';
else if(a==d&&a==c&&a!=b) std::cout<<"Yes"<<'\n';
else if(d==b&&d==c&&a!=d) std::cout<<"Yes"<<'\n';
else std::cout<<"No"<<'\n';
}
signed main()
{
int t;
std::cin>>t;
while(t--)
{
solve();
}
return 0;
}
数树数【算法赛】 - 蓝桥云课 (lanqiao.cn)
二叉树性质问题,不了解二叉树也完全可以做。
要注意的是每次都从第一行的第一个点开始走,给一个字符串按照它走,输出最后的结果就行。
往左走坐标就变成了2*pos-1,往右就变成了2*pos
画个树理解一下就好了。
#include <bits/stdc++.h>
signed main()
{
int n,q;
std::cin>>n>>q;
int pos=1;
while(q--)
{
pos=1;
std::string s;
std::cin>>s;
int i=0;
while(s[i])
{
if(s[i]=='L')
{
pos=2*pos-1;
}else if(s[i]=='R'){
pos*=2;
}
i++;
}
std::cout<<pos<<'\n';
}
return 0;
}
分组【算法赛】 - 蓝桥云课 (lanqiao.cn)
这题要求最大的极差最小。【二分答案题目整理】—— 最大化最小值 + 最大值最小化(上)_现在小红有一只木桶由 n 块木板组成,第 i 块木板的长度为 ai 。 现在你有一种魔法-CSDN博客
思维固化导致想不出二分,需要专门刷下二分了。。。。。
二分极差,然后判断如果以该极差来分组,所分的组数能否小于k(如果小于k,那么k肯定能满足。因为一个数可以单独成一组,即极差为0),如果能就减小极差继续试探,否则增大极差。
#include<bits/stdc++.h>
const int N=1e5+10;
int a[N];
int n,k;
bool check(int x)
{
int last=1,cnt=1;
for(int i=1;i<=n;i++)
{
if(a[i]-a[last]>x)//如果当前这个不行就分组
{
last=i;
cnt++;
}
}
return cnt<=k;
}
signed main()
{
std::cin>>n>>k;
for(int i=1;i<=n;i++) std::cin>>a[i];
std::sort(a+1,a+1+n);
int l=0,r=2e9,res=0;//枚举极差
while(l<=r)
{
int mid=l+r>>1;
if(check(mid))
{
res=mid;
r=mid-1;
}else l=mid+1;
}
std::cout<<res;
return 0;
}
健身【算法赛】 - 蓝桥云课 (lanqiao.cn)
十年OI一场空,不开longlong见祖宗。
这道题是一个完全背包问题,需要注意的是si范围是1e9,不开longlong会死。
首先dp预处理出 对应连续天数 能收获的最大分数。
然后对连续天数进行计算,每算出一个连续天数就加上对应的分数。
#include <bits/stdc++.h>
const int N=2e5+10;
#define int long long
int n,m,q;
int cantuse[N],k[N],s[N];
struct st{
int k,s;
}a[N];
int res,cnt;
int f[N];
#define int long long
void solve()//有i天怎么用最大化
{
for(int i=1;i<=m;i++)//对物品遍历
{
for(int j=a[i].k;j<=n;j++)//对容积遍历
{
f[j]=std::max(f[j],f[j-a[i].k]+a[i].s);
}
}
}
signed main()
{
std::cin>>n>>m>>q;
for(int i=1;i<=q;i++)
{
int d;
std::cin>>d;
cantuse[d]=1;
}
for(int i=1;i<=m;i++)
{
std::cin>>a[i].k>>a[i].s;
a[i].k=pow(2,a[i].k);
}
solve();
f[0]=0;
for(int i=1;i<=n;i++)
{
if(!cantuse[i]) cnt++;
else{
res+=f[cnt];
cnt=0;
}
}
if(cnt) res+=f[cnt];
std::cout<<res;
return 0;
}
契合匹配【算法赛】 - 蓝桥云课 (lanqiao.cn)
这题注意两个点,提前把一个字符串反转(大写改小写,小写改大写),剩下就只用判断是否子串就好了。
同时这题涉及到顺逆时针旋转的问题,我们只要让a=a+a,就能满足a顺逆时针旋转的情况。文章来源:https://www.toymoban.com/news/detail-725063.html
#include <bits/stdc++.h>
const int N = 1e6 + 10;
int n, ne[N];
std::string a, b;
void kmp()
{
for(int i=2,j=0;i<=n;i++)
{
while (j&&b[i]!=b[j+1]) j=ne[j];
if(b[i]==b[j+1]) j++;
ne[i]=j;
}
for (int i=1,j=0;i<=2*n;i++)
{
while(j&&a[i]!=b[j+1]) j=ne[j];
if (a[i]==b[j+1]) j++;
if(j==n)
{
std::cout<<"Yes\n"<<std::min((i-n),(2*n-i));
return ;
}
}
std::cout<<"No";
}
void solve()
{
std::cin >> n >> a >> b;
a=" "+a+a;
b=" "+b;
for(int i=1; i <=n; i++)
{
if (isupper(b[i])) b[i] = tolower(b[i]);
else b[i] = toupper(b[i]);
}
kmp();
}
signed main()
{
std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0);
solve();
return 0;
}
奇怪的线段【算法赛】 - 蓝桥云课 (lanqiao.cn)
这题似乎要用树状数组,博主还没学过,留个坑。文章来源地址https://www.toymoban.com/news/detail-725063.html
到了这里,关于「蓝桥·算法双周赛」第一场公开赛【待补题填坑】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!