【蓝桥杯历年真题合集】蓝桥杯2016初赛

✅🎡个人主页:程序猿追

✅🎡系列专栏:算法合集

✅🎡目前状态:创建Java学习之路(零基础到就业实战)系列,目前更新到JAVAWEB开发

✅🎡作者简介:大家好,我是程序猿追,全栈领域新星创作者,算法爱好者,常在作者周榜排名前30,某不知名的 ACMer

✅🎡推荐一款刷题面试找工作三不误的网站——牛客网

✅🎡个人名言:不积跬步无以至千里,趁年轻,使劲拼,给未来的自己一个交代!

 最大比例

X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:16,24,36,54。其等比值为:3/2
现在,我们随机调查了一些获奖者的奖金数。请你据此推算可能的最大的等比值。 

输入格式

输入存在多组测试数据
第一行为数字 N (0<N<100),表示接下的一行包含N个正整数
第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人的奖金数额

输出格式

对于每组测试数据,输出一个形如A/B的分数,要求A、B互质。表示可能的最大比例系数

输入样例

3
1250 200 32
4
3125 32 32 200
3
549755813888 524288 2

输出样例 

25/4
5/2
4/1

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll a[105];
map<ll,int> m;
//大于返回true;
bool cmp(ll i,ll j,ll m,ll n)
{
    return m*j > i*n;
}
int main()
{
    int n;
    cin>>n;
    int top = 0;
    for(int i = 0; i < n; i++)
    {
        ll tmp;
        cin>>tmp;
        if(m[tmp] == 0)
        {
            m[tmp] = 1;
            a[top++] = tmp;
        }
    }
    sort(a,a+top);
    ll t1 = a[0], t2 = a[1];
    for(int i = 1; i < top-1; i++)
    {
        if(cmp(t1,t2,a[i],a[i+1]))
        {
            t1 = a[i];
            t2 = a[i+1];
        }
    }
    ll a = __gcd(t1,t2);
    t2 /= a;
    t1 /= a;
    cout<<t2<<'/'<<t1;
    return 0;
}

 凑算式


这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?

输出格式

输出一个整数表示答案

傻逼吧,麻烦把题目条件改为1到9
#include<bits/stdc++.h>
using namespace std;
int s[9]={1,2,3,4,5,6,7,8,9};
int main()
{
    int res=0,a,b,c;
    do{
    
        a=s[0];
        int b=s[1]*(s[6]*100+s[7]*10+s[8])+s[2]*(s[3]*100+s[4]*10+s[5]);
        int c=s[2]*(s[6]*100+s[7]*10+s[8]);
        if(a+b/c==10&&b%c==0)
        {
            res++;
        }
    }while(next_permutation(s,s+9));
    cout<<res;
    return 0;
}

 四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多4个正整数的平方和。
如果把0包括进去,就正好可以表示为4个数的平方和。
比如:
5 = 0^2 + 0^2 + 1^2 + 2^2
7 = 1^2 + 1^2 + 1^2 + 2^2(^符号表示乘方的意思)
对于一个给定的正整数N,可能存在多种平方和的表示法。
要求你对4个数排序:0 <= a <= b <= c <= d
并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法

输入格式

输入存在多组测试数据,每组测试数据输入一行为一个正整数N (N<5000000)

输出格式

对于每组测试数据,要求输出4个非负整数,按从小到大排序,中间用空格分开

输入样例

5
12
773535

输出样例

0 0 1 2
0 2 2 2
1 1 267 838

#include<bits/stdc++.h>
using namespace std;

int main( )
{
    int n;
    cin>>n;
    for(int a=0;a<10000;a++)
    {
        for(int b=0;b<10000;b++)
        {
            for(int c=0;c<10000;c++)
            {
                for(int d=c;d<10000;d++)
                {
                    if(a*a+b*b+c*c+d*d==n)
                    {
                        
                        cout<<a<<" "<<b<<" "<<c<<" "<<d;
                        exit(0);
                    } 
                    if(a*a+b*b+c*c+d*d>n)
                    break;
                }
                if(a*a+b*b+c*c>n)
                break;
            }
            if(a*a+b*b>n)
            break;
        }
        if(a*a>n)
        break;
    }
    return 0;
}

 交换瓶子

有N个瓶子,编号 1 ~ N,放在架子上。
比如有5个瓶子:2 1 3 5 4,要求每次拿起2个瓶子,交换它们的位置。
经过若干次后,使得瓶子的序号为:1 2 3 4 5
对于这么简单的情况,显然,至少需要交换2次就可以复位。
如果瓶子更多呢?你可以通过编程来解决。

输入格式

输入存在多组测试数据,对于每组测试数据:
第一行: 一个正整数N(N<10000), 表示瓶子的数目
第二行:N个正整数,用空格分开,表示瓶子目前的排列情况。

输出格式

对于每组测试数据输出一行,包含一个正整数表示答案

输入样例

5
3 1 2 5 4
5
5 4 3 2 1

输出样例

3
2
#include<iostream>
using namespace std;
int ans=0;
int a[10000];
int n;
int pos(int x)
{
    for(int i=1;i<=n;i++)
    {
        if(a[i]==x)
        return i;
        
    }
    return -1;
}
void swap(int i,int j)
{
    int t=a[i];
    a[i]=a[j];
    a[j]=t;
}
int main()
{

    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        if(a[i]!=i)
        {
            swap(pos(i),i);
            ans++;
        }
        if(a[i]==i)
        continue;
    }
    cout<<ans;
}

 移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。
其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号。
比如:当小区排号宽度为6时,开始情形如下:

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 ..... 

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离
(不能斜线方向移动)

输入格式

输入存在多组测试数据
输入为3个整数w m n,空格分开,都在1到10000范围内
w为排号宽度,m,n为待计算的楼号。

输出格式

要求输出一个整数,表示m n 两楼间最短移动距离。

输入样例 复制

6 8 2
4 7 20

输出样例 复制

4
5
#include<iostream>
#include<cmath>

using namespace std;

int main()
{
    int w, m, n, temp;
    int i = 0, j = 0,k = 0, temp1 = 0, temp2 = 0;
    while(cin >> w >> m >> n)
    {
        int sum = 0;
        i = 0, j = 0,k = 0, temp1 = 0, temp2 = 0;
        if(m > n)
        {
            temp = m;
            m = n;
            n = temp;
        }


        while(i < m)
        {
            i += w;
            j += 1;
        }//m在第j行
        for(int p = i - w; p <= i; p ++, temp1 ++)
            if(p == m)
            break;
        if(j % 2 == 0)
            temp1 = w - temp1 + 1; //m在第j行从左到右第temp1列
            i=0;
        while(i<n)
        {
            i += w;
            k += 1;
        }//n在第k行

        for(int p = i - w; p <= i; p ++, temp2 ++)
            if(p == n)break;
        if(k % 2 == 0)temp2 = w - temp2 + 1;//n在第k行从左到右第temp2列
        sum += k - j + abs(temp2 - temp1);//总距离为行数差+列数差

        cout << sum << endl;
    }
    return 0;
}

算法对程序员来说及其重要,语言和开发平台不断变化,但是万变不离其宗的是那些算法和理论,依稀记得我那个玩的很好的一个学长(在大二就拿到了 offer),他告诉我想找一个好的工作,那刷题一定是必不可少的

现在算法刷题平台还是蛮多的,给大家介绍一个我认为与大厂关联最深的平台——牛客网

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿追

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值