牛客网练习赛33

1.tokitsukaze and RPG

链接:https://ac.nowcoder.com/acm/contest/308/B
来源:牛客网
 

题目描述

tokitsukaze最近沉迷一款RPG。
这个RPG一天有k分钟,每一天从第1分钟开始。
有n种怪物,第i种怪物每天第一次出现的时间为Xi分钟,第二次出现的时间为2*Xi分钟,第三次出现的时间为3*Xi分钟......同一时刻出现的怪物种类越多,打怪获得的经验也越高。
为了高效练级,tokitsukaze想知道在一天内出现怪物种类最多的时间点会出现多少种怪物,这样的时间点有多少个。

输入描述:

第一行包括2个正整数n,k(1≤n≤10^5,1≤k≤10^6),表示有n种怪物,一天有k分钟。
接下来一行包括n个正整数X(1≤Xi≤10^6),含义如题面所示。

输出描述:

输出一行,包括两个整数a,b。
a表示怪物种类数,b表示时间点的个数。

示例1

输入

3 6
2 2 3

输出

3 1

说明

在第6分钟时,3种怪物都出现了。

示例2

输入

3 5
2 2 3

输出

2 2

说明

在第2分钟和第4分钟时,第一种和第二种怪物出现了。

示例3

输入

6 10
1 2 3 4 5 6

输出

4 1

说明

在第6分钟时,出现了第一种、第二种、第三种、第六种怪物。

示例4

输入

3 5
6 6 6

输出

0 5

说明

在第1分钟、第2分钟、第3分钟、第4分钟、第5分钟,都没有出现怪物。

输入的两个数是怪物的种数与一天的时间数。分别用n、k表示

输出的是怪物的种数与时间点的个数,(怪物种数最多的情况)

怎么求怪物种数最多的情况?

1.先求在k时间内各个时间对应的怪物种数

2.使用for循环找到最大的怪物种数,然后作为Ans1,使用Ans2+=cnt[i]==Ans1;求出出现最大的怪物数的时间出现的次数。

3.输出。

关键点是怎么求k分钟内每分钟出现的怪物种数

比如在第二分钟出现怪物(k=6),第二分钟,第四分钟,第六分钟也会出现怪物

#include<bits/stdc++.h>
#define M(a) memset(a,0,sizeof(a))

using namespace std;
const int maxn=1e6+5;
int n,k,m,ans1[maxn],ans2[maxn];

int main()
{
    memset(ans1,0,sizeof(ans1));
    memset(ans2,0,sizeof(ans2));
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;++i)
        scanf("%d",&m),ans1[m]++;
    for(int i=1;i<=k;++i)
        for(int j=i;j<=k;j+=i)
            ans2[j]+=ans1[i];//每分钟出现的次数
    int maxx=0,number=0;
    for(int i=1;i<=k;++i)
        if(maxx<ans2[i])
        maxx=ans2[i];//maxx记录最大次数
    for(int i=1;i<=k;++i)
    {
        if(ans2[i]==maxx)number++;
    }
    printf("%d %d\n",maxx,number);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zbq_tt5/article/details/84889404
今日推荐