1798: 宝石

26 篇文章 2 订阅
11 篇文章 0 订阅

题目描述

 在遥远的大麦哲伦星系有一颗盛产宝石的行星,这种宝石可以发出美丽的光芒因此广受宇宙公民的喜爱,现在一支地球的采矿小队来到了这颗神奇的行星并且成功开采了n颗宝石,他们准备利用这些宝石制作项链,每个项链都有一个美丽值,他们希望获得美丽值最大的项链,每一颗宝石都有一个光芒值ai(i=1..n),项链的美丽值等于组成项链的宝石的光芒值的最大公约数 (比如由光芒值为 6,9,12宝石组成的项链的美丽值为3)。现在小队队长决定先暂时制作一个项链,当取i(i=1..n)颗宝石制做时总会对应一个最大美丽值fi(i=1...n),现在他想知道出现次数最多fi的(如果次数相同选fi值大的)。

输入

   第一行输入一个正整数n,第二行输入n个正整数ai(i=1..n)。

输出

一个正整数w,表示出现次数最多的fi的值。

输入样例 Copy

6
1 2 2 4 3 6

输出样例   Puts

 2

提示

 

n<=1e4,ai<=1e6

一个数的最大公约数即本身。

样例:i=1,选(6)f1=6;

i=2,选(6,3)f2=3;

i=3,选(2,2,4)f3=2;

i=4,选(2,2,4,6)f4=2;

i=5,选(1,2,2,3,4)f5=1;

i=6,选(1,2,2,4,3,6)f6=1;

发现i=3和i=4有fi=2,出现两次所以w=fi=2。

题解

#include<stdio.h>
int num[1000010], sum[1000010];
void func(int x)//求每个数的约数
{
    for (int i = 1; i <= x / i;i++)
        if(x%i==0)
        {
            num[i]++;//标记每种约数的出现次数
            if(x/i!=i)num[x / i]++;
        }
}
int max(int x,int y)//返回最大值
{
    if(x>y)return x;
    else return y;
}
int main()
{
    int n, maxn = 0, ans = 1, w = 0, res = 0;
    scanf("%d", &n);
    for (int i = 1; i <= n;i++)
    {
        int x;
        scanf("%d", &x);
        func(x);
        maxn = max(x, maxn);//maxn记录最大数也就是最大的约数
    }
    for (int i = maxn; i >= 1 && ans <= n;)//i从maxn开始以满足每种项链的美丽值最大
    {
        if(num[i]>=ans)
        {
            sum[i]++;//sum记录对应约数(美丽值)的出现次数
            if(sum[i]>res)
                w = i, res = sum[i];//res记录次数的最大值,w记录对应的美丽值
            ans++;//ans为你需要选择的宝石数,如果num[i]成功则组成的宝石数加一
        }
        else i--;//如果这个约数无法满足要求则遍历其他约数
    }
    printf("%d", w);
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

熟人看不到

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

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

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

打赏作者

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

抵扣说明:

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

余额充值