11场蓝桥杯双周赛题解

1.国际博物馆日【算法赛】 - 蓝桥云课 (lanqiao.cn)

#include <iostream>
using namespace std;
int main()
{
 cout<<"museum"<<endl;
  return 0;
}

2.最小值取余【算法赛】 - 蓝桥云课 (lanqiao.cn)

贪心排个序就行了

void solve()
{
   cin>>n;
   for(int i=1;i<=n;i++)
     cin>>a[i];
    sort(a+1,a+1+n);
    int x=0;
    for(int i=1;i<=n;i++)
    {
      x=(x*10+a[i])%p;
    }
    cout<<x<<endl;
}

3.小蓝方程【算法赛】 - 蓝桥云课 (lanqiao.cn)

简单的分类讨论

只要看这个 a = a ∗ n a=a*n a=an

n = 1 n=1 n=1时候 a a a可以为任意数

a = 0 a=0 a=0的时候 n n n可以是任意数

还有一个 0 , 0 0,0 0,0是特殊情况

所以答案就是 X + Y + 1 X+Y+1 X+Y+1

void solve()
{
  cin>>x>>y;
  cout<<(x+y)+1<<endl;
}

4.玩偶购买【算法赛】 - 蓝桥云课 (lanqiao.cn)

分类讨论不会

5.数学魔术家【算法赛】 - 蓝桥云课 (lanqiao.cn)

贪心:最大的就直接从大到小排个序输出,最小就从小到大输出,如果有前导 0 0 0就把 0 0 0放在第一个非 0 0 0数的后面即可

void solve()
{
   string s;
   cin>>s;
   sort(s.begin(),s.end());
   reverse(s.begin(),s.end());
   cout<<s<<' ';
   sort(s.begin(),s.end());
   if(s[0]=='0')
   {
     int i=0;
     while(s[i]=='0')i++;
    cout<<s[i];
    int j=i+1;
      i=0;
     while(s[i]=='0')cout<<s[i++];
     for(j;j<s.size();j++)
       cout<<s[j];
     cout<<endl;
   }
   else
   {
     cout<<s<<endl;
   }
}

6.矿石样本分析【算法赛】 - 蓝桥云课 (lanqiao.cn)

这题类似与leetcode的第一题两数之和,只要存下每个 a i a_i ai的下标 i i i,然后就判断枚举两个机器的出发点即可

void solve()
{
  cin>>n>>k;
  for(int i=1;i<=n;i++)
    cin>>a[i];
  map<int,vector<int>>mp;
  mp.clear();
  for(int i=1;i<=n;i++)
    mp[a[i]].push_back(i);
  int res=0x3f3f3f3f;
  for(int i=1;i<=n;i++)
  {
    if(mp[k-a[i]].size()==0)continue;
    if(k-a[i]==a[i])continue;
    for(auto x:mp[k-a[i]])
    {
       res=min(res,max(min(i,n-i+1),min(x,n-x+1)));
    }
  }
  if(res==0x3f3f3f3f)
  {
    cout<<-1<<endl;
    return;
  }
  cout<<res<<endl;
}

4.拔苗助长【算法赛】 - 蓝桥云课 (lanqiao.cn)

知识点:一个合数可以分解成若干个质因数。完全平方数的概念是 x 2 x^2 x2就是完全平方数

你可以让 h i h_i hi变成 h i ∗ p h_i*p hip,其中 p p p是任意的质因数。所以我们把每个 h i h_i hi分解成若干个质因数,如果某个质因数的个数是奇数就答案+1

int n,k;
int a[N]; 
map<int,int>mp;
void divide(int n)
{
    for(int i=2;i<=n/i;i++)
    {
        if(n%i==0)
        {
           int s=0;
            while(n%i==0)
            {
                s++;
                n=n/i;
            }
        mp[i]=s;
        }
    }
    if(n>1)mp[n]++;
}

void solve()
{
  cin>>n;
  int res=0;
  for(int i=1;i<=n;i++)
  {
    cin>>a[i];
    mp.clear();
    divide(a[i]);
    for(auto x:mp)
      if(x.second%2==1)res++;
  }
  cout<<res<<endl;
}

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值