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

简介: 最大比例X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。并且,相邻的两个级别间的比例是个固定值。也就是说:所有级别的奖金数构成了一个等比数列。比如:16,24,36,54。其等比值为:3/2现在,我们随机调查了一些获奖者的奖金数。请你据此推算可能的最大的等比值。输入格式输入存在多组测试数据第一行为数字 N (0<N<100),表示接下的一行包含N个正整数第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人.

最大比例

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

image.gif

输出样例

25/4
5/2
4/1

image.gif

#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;
}

image.gif

凑算式

image.png

这个算式中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;
}

image.gif

四平方和

四平方和定理,又称为拉格朗日定理:每个正整数都可以表示为至多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

image.gif

输出样例

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

image.gif

#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;
}

image.gif

交换瓶子

有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

image.gif

输出样例

3
2

image.gif

#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;
}

image.gif

移动距离

X星球居民小区的楼房全是一样的,并且按矩阵样式排列。

其楼房的编号为1,2,3... 当排满一行时,从下一行相邻的楼往反方向排号。

比如:当小区排号宽度为6时,开始情形如下:

1  2  3  4  5  612 11 10 9  8  713 14 15 .....

我们的问题是:已知了两个楼号m和n,需要求出它们之间的最短移动距离

(不能斜线方向移动)

输入格式

输入存在多组测试数据

输入为3个整数w m n,空格分开,都在1到10000范围内

w为排号宽度,m,n为待计算的楼号。

输出格式

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

输入样例 复制

6 8 2
4 7 20

image.gif

输出样例 复制

4
5

image.gif

#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;
}

image.gif



相关文章
|
6月前
|
传感器
|
搜索推荐
蓝桥杯历年真题题解----2020年-- 排序
蓝桥杯历年真题题解----2020年-- 排序