第一题0带宽 - 蓝桥云课
考的是8Mbps=1MB/s直接算就行--》200/8
第二题0纯质数 - 蓝桥云课
dfs枚举
每个十进制位上都是质数--》直接用2,3,5,7填充每一位然后枚举--》符合条件的即
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=15;
int a[5]={2,3,5,7};
int ans[N];
int res=0;
ll limit = 20210605;
bool isprim(ll x)
{
if(x<=1)return false;
for(int i=2;i*i<=x;i++)
{
if(x%i==0)return false;
}
return true;
}
void dfs(int x,ll sum)
{
if(sum>limit)return;
if(sum>=1&&sum<=limit&&isprim(sum))
{
res++;
}
if(x>=10)return;
for(int i=0;i<4;i++)
{
ans[x]=i;
dfs(x+1,sum*10+a[i]);
}
}
int main()
{
dfs(1,0);
cout<<res<<endl;
return 0;
}
第三题0完全日期 - 蓝桥云课
日期题目--》用日期模板一个个枚举,符合条件的就++
cpp
#include<iostream>
#include<cstring>
#include<iostream>
using namespace std;
int ans=0;
bool check(int y,int m,int d)
{
int sum=0;
sum=y%10+(y/10%10)+(y/100%10)+(y/1000)+m%10+(m/10)+d%10+(d/10);
for(int i=1;i*i<=sum;i++)
{
if(i*i==sum)
{
return true;
}
}
return false;
}
int main()
{
for(int y=2001;y<=2021;y++)
{
for(int m=1;m<=12;m++)
{
for(int d=1;d<=31;d++)
{
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
{
}
else if(m==2)
{
if((y%4==0&&y%100!=0)||(y%400==0))
{
if(d>29)continue;
}
else
{
if(d>28)continue;
}
}
else
{
if(d>30)continue;
}
if(check(y,m,d))
{
ans++;
}
}
}
}
cout<<ans<<endl;
return 0;
}
第四题0最小权值 - 蓝桥云课
是一个模拟题目--》但是要记得一个点:左右子树个数=n-1也就是减去根节点的个数--》然后枚举左右子树的个数
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
long long dp[2022];
int l,r;
int main()
{
memset(dp,0x3f3f3f3f,sizeof dp);
dp[0]=0;
for(int i=1;i<=2021;i++)
{
for(int j=0;j<i;j++)
{
l=j;
r=i-j-1;
dp[i]=min(dp[i],1+2*dp[l]+3*dp[r]+l*l*(r));
}
}
cout<<dp[2021];
return 0;
}
第五题0大写 - 蓝桥云课
一个简单的模拟题,就是遍历字符串把小写转大写
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=110;
string s;
int main()
{
cin>>s;
for(int i=0;i<s.length();i++)
{
char a=s[i];
if(a>='a'&&a<='z')
{
s[i]=a+'A'-'a';
}
}
cout<<s<<endl;
return 0;
}
第六题0123 - 蓝桥云课
前缀和解决(但这个题目稍微有点绕)
首先要算出他在哪一组,然后再找出他在这一组的哪个位置
拿到了12分有一部分运行超时了
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=100010;
ll sum[N];
int n;
ll totalsum(ll k)
{
return k*(k+1)*(k+2)/6;
}
ll jisuan(ll x)
{
if(x==0)return 0;
ll i=1;
while(i*(i+1)/2<x)
{
i++;
}
//在第i组
ll prelen=(i-1)*i/2;
ll curx=x-prelen;
return totalsum(i-1)+curx*(curx+1)/2;
}
int main()
{
cin>>n;
while(n--)
{
ll x,y;
cin>>x>>y;
cout<<jisuan(y)-jisuan(x-1)<<endl;
}
return 0;
}
第七题0异或变换 - 蓝桥云课
同样也是直接模拟--》但是会超时(拿到12分)
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=10010;
string s;
int n;
long long t;
int main()
{
cin>>n>>t;
cin>>s;
while(t--)
{
string old=s;
for(int i=1;i<n;i++)
{
s[i]=(old[i-1]==old[i])?'0':'1';
}
}
cout<<s<<endl;
return 0;
}
第八题0二进制问题 - 蓝桥云课
暴力解决--》直接就是枚举1-n当中符合条件的,这样肯定会运行超时--》拿到10分
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const ll N=1e18;
ll n;
int k;
int jisuan(ll x)
{
int cnt=0;
while(x)
{
cnt+=(x&1);
x>>=1;
}
return cnt;
}
int main()
{
cin>>n>>k;
int ans=0;
for(ll i=1;i<=n;i++)
{
if(jisuan(i)==k)
{
ans++;
}
}
cout<<ans<<endl;
return 0;
}
第九题0翻转括号序列 - 蓝桥云课
直接模拟暴力解决--》一开始我以为暴力过不了的,结果过了
cpp
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stack>
using namespace std;
const int N=1000010;
int n,m;
string s;
void op1(int l,int r)
{
for(int i=l-1;i<=r-1;i++)
{
if(s[i]=='(')s[i]=')';
else s[i]='(';
}
}
int op2(int l)
{
int L=l-1;
int balance=0;
int maxR=0;
for(int i=L;i<n;i++)
{
if(s[i]=='(')balance++;
else balance--;
if(balance<0)break;
if(balance==0)maxR=i+1;
}
return maxR;
}
int main()
{
cin>>n>>m;
cin>>s;
while(m--)
{
int op;
int l,r;
cin>>op;
if(op==1)
{
cin>>l>>r;
op1(l,r);
}
if(op==2)
{
cin>>l;
cout<<op2(l)<<endl;
}
}
return 0;
}
第十题0异或三角 - 蓝桥云课
dfs枚举(暴力解决)5分
cpp
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000010;
int T;
int n;
int ans=0;
int path[4];
bool check()
{
int a=path[1],b=path[2],c=path[3];
if (a > b) swap(a, b);
if (a > c) swap(a, c);
if (b > c) swap(b, c);
// 三角形条件
return a + b > c;
}
void dfs(int x,int start)
{
if(x>3)
{
if((path[1]^path[2]^path[3])==0)
{
if(check())
{
int a=path[1],b=path[2],c=path[3];
if(a==b&&b==c)ans+=1;
else if(a==b||b==c||a==c)ans+=3;
else ans+=6;
}
}
return;
}
for(int i=start;i<=n;i++)
{
path[x]=i;
dfs(x+1,i);
}
}
int main()
{
cin>>T;
while(T--)
{
cin>>n;
ans=0;
dfs(1,1);
cout<<ans<<endl;
}
return 0;
}