4 英雄出场王(C++思路和代码)分治法练习4

英雄联盟总决赛正在若火如荼的展开,盲僧、刀妹、酒桶、青钢影等各路英雄悉数登场,当一个英雄被选出场时系统自动登记其序号,出场次数最多的英雄成为出场王。给定英雄序号的出场集合T,例如,T={2,4,4,4,6,7}。其出场王是4号英雄,出场次数为3。对于给定的由n个序号组成的出场集T,计算出场王序号及其出场次数。如果出现多个出场王,请输出序号最小的那个。

输入格式:

输入数据的第1行是英雄出场集T中序号个数n(n<1000);第二行输入n个出场英雄序号。

输出格式:

输出数据的第1行给出出场王序号,第2行是出场次数。

输入样例1:

6
2 4 4 4 6 7

输出样例1:

4
3

输入样例2:

10
1234568 828 12345 898232689 12345 12345 9876 321 3 12345

输出样例2:

12345
4

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <iostream>
#include <algorithm>

using namespace std;

void show(long long a[], int size);  //测试用输出
void QuickSort(long long a[], int p, int r); //快速排序
int Partition(long long a[], int p, int r);  //快速排序
void Continue(long long a[], int size);      //题意要求函数

int main()
{
    int n;
    cin >> n;
    long long a[n];
    for(int i = 0; i < n; i++)
        cin >> a[i];
    QuickSort(a, 0, n-1);
    //show(a, n);
    Continue(a,n);

    return 0;
}

//快速排序的两个函数
void QuickSort(long long a[], int p, int r)
{
    if(p >= r)
        return;
    int q = Partition(a, p, r);
    QuickSort(a, p, q-1);
    QuickSort(a, q+1, r);
}

int Partition(long long a[], int p, int r)
{
    int i = p-1;
    int j = p;
    while(j < r)
    {
        if(a[j] <= a[r])
        {
            swap(a[i+1], a[j]);
            i++;
        }
        j++;
    }
    swap(a[i+1], a[r]);
    return i+1;
}

//看最长连续相同数的函数
void Continue(long long a[], int size)
{
    //用来测试每组连续的长度
    int m = 0;
    int max = 0;
    long long king = a[0]; //当前出场王
    long long stand = a[0];//当前对比数
    for(int i = 0; i < size; i++)
    {
        //当下一个数连续相等时,m++
        if(a[i] == stand)
        {
            m++;
            if(m > max)
            {
                max = m;
                king = a[i];
            }
        }
        //不相等就清空m
        else
        {
            m = 1;
            stand = a[i];
        }


    }
    cout << king << '\n' << max << endl;
}

//输出数组
void show(long long a[], int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}

不分治怎么做:

#include <iostream>

using namespace std;
long long b[10010] = {0};

int main()
{
    int n;
    cin >> n;
    long long a[n];
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
        b[a[i]]++;
    }

    long long maxpoi = 0;
    long long maxval = 0;
    int i = 0;
    while(i < n)
    {
        if(maxval < b[a[i]])
        {
            maxpoi = a[i];
            maxval = b[a[i]];
        }
        i++;
    }
    cout << maxpoi << endl << maxval;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百年bd

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

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

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

打赏作者

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

抵扣说明:

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

余额充值