蓝桥杯模拟测试

这次比赛给我的感觉怪怪的,总感觉这个题不正经(希望别被老师看到),所以打比赛的时候也没有特别紧张的感觉,总感觉全是一些找规律的题,然后就在那磨啊磨,功夫不负有心人,C题WA了61次终于A了/滑稽(一遍遍的试答案)

A - 结果填空:阶乘位数
蒜头君对阶乘产生了兴趣,他列出了前 10

个正整数的阶乘以及对应位数的表:
n
n!
位数
1 1 1
2 2 1
3 6 1
4 24 2
5 120 3
6 720 3
7 5040 4
8 40320 5
9 362880 6
10 3628800 7

对于蒜头君来说,再往后就很难计算了。他试图寻找阶乘位数的规律,但是失败了。现在请你帮他计算出第一个正整数的阶乘位数大于等于 10000
的数是多少,即求最小的正整数 n 满足 n! 的位数大于等于 10000。

一道填空题,直接输出答案就好了,一道典型的大数问题。
解决方法:设答案为n,需要求n!>=10^10000,两边同时取log10的对数,然后就变成了log10(1 * 2 * 3*…n)>=10000,然后利用数学法则
log10(a
b)=log10(a)+log10(b),所以上面那个式子的左边就可以变成log10(1)+log10(2)+…log10(n),这样跑一个循环就行了

正确代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int i,j;
    double sum;
    for(i=1;; i++)
    {
        sum=0;
        for(j=1; j<=i; j++)
            sum+=log10(j);
        if(sum>=10000)
        {
            printf("%d\n",i);//答案是3249
            break;
        }
    }
    return 0;
}

B - 结果填空:炮台实验

蒜头君在玩一个战争模拟游戏,他有高度为 1,2,3,…,n 的炮台各一个,他需要把这 n

个炮台从左往右排成一行,并且炮口都朝向右边。

在这个游戏中,所有炮台发射的炮弹会摧毁前方所有高度比自己低的炮台。每当蒜头君把 n
个炮台排成一行后,可能会有一些炮台被摧毁。举个例子:当前有 5 个炮台,从左到右高度分别为 2,1,3,5,4,往右发射炮弹后,高度为 4 的炮台被高度为 5 的摧毁,高度为 1 的炮台被高度为 2 的炮台摧毁,最后只会剩下 2,3,5

这三个炮台。

现在蒜头君想知道,如果随机地摆放这 n
个炮台,最后剩下炮台个数的期望是多少?比如 n=2 时,有两种摆放方式,高度序列分别为 1,2 和 2,1,前者最后剩下 2 个炮台,后者最后剩下一个炮台,因此期望为 (2+1)/2=1.5000。
请你求出 n=2019
时剩下炮台个数的期望,保留四位小数。

找规律,列出n为1-4的结果然后找规律就一目了然了。
规律为:1/1+1/2+1/3+…1/2019
正确代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int i;
    double sum=0;
    for(i=1; i<=2019; i++)
        sum+=1.0*1/i;
    printf("%.4f\n",sum);
    return 0;
}

J - 程序设计:轻重搭配
n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 x 的人可以和体重至少为 2x 配对,这样两人只需买一张票。现在给出了 n个人的体重,请你计算他们最少需要买几张门票?

输入格式
第一行一个整数 n,表示人数。
第二行 n个整数,每个整数 ai表示每个人的体重。

输出格式
一个整数,表示最少需要购买的门票数目。
数据范围:
对于 30%的数据:1≤n≤25,1≤ai≤100。
对于 60%的数据:1≤n≤10000,1≤ai≤1000。
对于 100%的数据:1≤n≤5⋅105,1≤ai≤105。

样例解释
1和 9 配对,7 和 3 配对,剩下 5,5 单独,一共买四张票。

Sample Input

6
1 9 7 3 5 5

Sample Output

 4

思路:先排序然后贪心,从中间靠左的那个位置开始贪,与最末尾的数进行比较,如果符合题意,则两个数都左移,如果不符合题意,则左边的那个数左移,右边的数不能浪费。

正确代码:

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n,i,j,a[500010],sum=0;
    scanf("%d",&n);
    for(i=0; i<n; i++)
        scanf("%d",&a[i]);
    sort(a,a+n);
    for(i=n/2-1,j=n-1; i>=0&&j>n/2-1;)
    {
        if(a[i]*2<=a[j])
        {
            i--;
            j--;
            sum++;
        }
        else
            i--;
    }
    sum+=n-2*sum;
    printf("%d\n",sum);
    return 0;
}

还有其他的一些题(也就是我说的C题)由于我是一个个答案试的,所以这里就不贴代码了,另外还得补一下剩下的题,留个坑吧,以后再填。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值