牛客春招刷题训练营 - 2025.4.1 题解
活动地址:牛客春招刷题训练营 - 编程打卡活动
Easy 完全数计算
简要题意
求 以内完美数个数。
Solution
可以直接预处理每个数的因子,然后暴力判断每个数是否为完美数。
因为 以内的数因子总数和相当于
的,所以理论复杂度没问题。
事实上这题的空间限制比较严格,直接做上面的做法可能不能通过。
但是跑一下会发现完美数很少,在 之内只有四个,所以直接判断
是否大于等于这四个数就好。
Code
void R()
{
/*
constexpr int MAXN=5e5+7;
vector<vector<int>> adj(MAXN);
for (int i=1;i<MAXN;i++)
for (int j=2;i*j<MAXN;j++)
adj[i*j].push_back(i);
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
int x=i;
for (int t:adj[i])
x-=t;
if (x==0) cout<<i<<'\n';
}
*/
int ans=0,n;
cin>>n;
vector<int> a={6,28,496,8128};
for (int x:a)
if (x<=n)
ans++;
cout<<ans;
return;
}
Medium 密码强度等级
简要题意
给一个字符串,根据字符串含有字符种类及长度有对应的规则对其赋分。
根据该字符串获得分数所在分数段进行对应的输出。
Solution
按题意一直 if-else
模拟就好了。
Code
void R()
{
string s;
int ABC=0,abc=0,num=0,sign=0,pts=0;
cin>>s;
for (char c:s)
{
if (c>='A'&&c<='Z')
ABC++;
else if (c>='a'&&c<='z')
abc++;
else if (isdigit(c))
num++;
else sign++;
}
if (s.size()>=8)
pts+=25;
else if (s.size()>=5)
pts+=10;
else
pts+=5;
if (ABC&&abc)
pts+=20;
else if (ABC||abc)
pts+=10;
if (num>1)
pts+=20;
else if (num)
pts+=10;
if (sign>1)
pts+=25;
else if (sign)
pts+=10;
if (ABC&&abc&&num&&sign)
pts+=5;
else if ((ABC||abc)&&num&&sign)
pts+=3;
else if ((ABC||abc)&&num)
pts+=2;
if (pts>=90)
cout<<"VERY_SECURE";
else if (pts>=80)
cout<<"SECURE";
else if (pts>=70)
cout<<"VERY_STRONG";
else if (pts>=60)
cout<<"STRONG";
else if (pts>=50)
cout<<"AVERAGE";
else if (pts>=25)
cout<<"WEAK";
else
cout<<"VERY_WEAK";
return;
}
Hard 活动安排
简要题意
给 个活动,做每个活动需要占用特定的时间段,求在活动占用时间不重合前提下能做的最多活动个数。
Solution
贪心。显然上个任务完成得越早,之后能接的任务越多,至少不劣。
所以将所有任务根据结束时间排序,贪心地做能做的任务就是一个最优解。
Code
void R()
{
int n,now=0,ans=0;
cin>>n;
vector<array<int,2>> v(n);
for (auto &x:v) cin>>x[1]>>x[0];
sort(v.begin(),v.end());
for (auto &x:v)
if (x[1]>=now)
{
now=x[0];
ans++;
}
cout<<ans;
return;
}
#牛客春招刷题训练营#