牛客网OJ题解--20210227

锦标赛

https://ac.nowcoder.com/acm/problem/13223

本系列记录翀翀😐痛苦的刷题日志,所有题目均来自于牛客网OJ题目,坚持刷题谈起来容易做起来难,希望我可以坚持下去,这里仍然分享一段励志文案:每个人都有梦想,然而有些人把梦想变成了现实,有些人的梦想依旧是梦想,只因为他们为梦想付出的努力程度不一样,他们坚持的时间不一样,最终才有这样的结果。

NC13223-锦标赛

题目链接

https://ac.nowcoder.com/acm/problem/13223

题目描述

组委会正在为美团点评CodeM大赛的决赛设计新赛制。比赛有 n 个人参加(其中 n 为2的幂),每个参赛者根据资格赛和预赛、复赛的成绩,会有不同的积分。比赛采取锦标赛赛制,分轮次进行,设某一轮有 m 个人参加,那么参赛者会被分为 m/2 组,每组恰好 2 人,m/2 组的人分别厮杀。我们假定积分高的人肯定获胜,若积分一样,则随机产生获胜者。获胜者获得参加下一轮的资格,输的人被淘汰。重复这个过程,直至决出冠军。现在请问,参赛者小美最多可以活到第几轮(初始为第0轮)?

第一行一个整数 n (1≤n≤ 2^20),表示参加比赛的总人数。接下来 n 个数字(数字范围:-1000000…1000000),表示每个参赛者的积分。小美是第一个参赛者。小美最多参赛的轮次。

测试样例

输入

4
4 1 2 3

输出

2

解题思路

我们统计一下小于等于小妹积分的人数,对于每一次比赛,都是人数/2,所以每一次比赛后小于等于小妹积分的人数也会减小2倍,这样当没有小于等于小妹积分的人时小妹就该淘汰了,所以只需检验人数是2的几次方即可。

解题代码

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

int main()
{
    int a, b, n, j = 1;
    cin >> n;
    cin >> a;
    for (int i = 1; i < n; i++)
    {
        cin >> b;
        //找出所有小于mei积分的人数
        if (b <= a)
            j++;
    }
    //最后求出取2对数的向下取整即为答案,小美可以进行的最多轮数
    cout << (int)log2(j) << endl;
    system("pause");
    return 0;
}

NC14503-晨跑

题目链接

https://ac.nowcoder.com/acm/problem/14503

题目描述

“无体育,不清华”、“每天锻炼一小时,健康工作五十年,幸福生活一辈子”。在清华,体育运动绝对是同学们生活中不可或缺的一部分。为了响应学校的号召,模范好学生王队长决定坚持晨跑。不过由于种种原因,每天都早起去跑步不太现实,所以王队长决定每a天晨跑一次。换句话说,假如王队长某天早起去跑了步,之后他会休息a-1天,然后第a天继续去晨跑,并以此类推。王队长的好朋友小钦和小针深受王队长坚持锻炼的鼓舞,并决定自己也要坚持晨跑。为了适宜自己的情况,小钦决定每b天早起跑步一次,而小针决定每c天早起跑步一次。某天早晨,王队长、小钦和小针在早起跑步时相遇了,他们非常激动、相互鼓励,共同完成了一次完美的晨跑。为了表述方便,我们把三位同学相遇的这天记为第0天。假设三位同学每次晨跑的时间段和路线都相同,他们想知道,下一次三人在跑步时相遇是第几天。由于三位同学都不会算,所以希望由聪明的你来告诉他们答案。

输入共一行,包含三个正整数a,b,c,表示王队长每隔a天晨跑一次、小钦每隔b天晨跑一次且小针每隔c天晨跑一次。输出共一行,包含一个正整数x,表示三位同学下次将在第x天相遇。

测试样例

输入

2 3 5

输出

30

解题思路

实际上就是求解a,b,c三者的最小公倍数。可以先对a,b求最小公倍数,再求ab的最小公倍数与c的最小公倍数即可。这里主要是记录一下板子。并且最小公倍数=两个数相乘/最大公约数。

解题代码

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

//最小公倍数=两数乘积/最大公约数
long f(long a, long b)
{
    long m = a * b;
    //最大公约数--相减法
    //     while(a<b || a>b){
    //        if(a<b)b=b-a;//此时最终b是最大公约数
    //        if(a>b)a=a-b;//此时最终a是最大公约数
    //    }

    /*最大公约数--辗转相除法*/
    if (b > a)
        swap(a, b);
    long c = a % b;
    while (c != 0)
    {
        a = b;
        b = c;
        c = a % b;
    }//此时b是最大公约数

    return m / b;
}
int main()
{
    long a, b, c;
    cin >> a >> b >> c;
    long cnt = f(a, b);
    long ans = f(cnt, c);
    cout << ans << endl;
    system("pause");
    return 0;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务