链接:https://ac.nowcoder.com/acm/contest/308/B
来源:牛客网
题目描述
tokitsukaze最近沉迷一款RPG。
这个RPG一天有k分钟,每一天从第1分钟开始。
有n种怪物,第i种怪物每天第一次出现的时间为Xi分钟,第二次出现的时间为2*Xi分钟,第三次出现的时间为3*Xi分钟......同一时刻出现的怪物种类越多,打怪获得的经验也越高。
为了高效练级,tokitsukaze想知道在一天内出现怪物种类最多的时间点会出现多少种怪物,这样的时间点有多少个。
这个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表示时间点的个数。
示例4
说明
在第1分钟、第2分钟、第3分钟、第4分钟、第5分钟,都没有出现怪物。
题意还是很简单的,直接暴力就能过,但是注意的就是很有可能几个怪物的Xi相同,所以注意一下暴力方式,不然怎么改死活也只会过95%
#include<iostream>
int brr[1000001];
int crr[1000001];
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
int arr[100001];
for(int i=0;i<n;i++)
{
cin>>arr[i];
crr[arr[i]]++; //相同的Xi
}
for(int i=1;i<=k;i++)
{
if(crr[i]!=0) //降低复杂度,虽然不加也对还不超时(垃圾数据)
for(int j=i;j<=k;j+=i)
{
brr[j]+=crr[i];
}
}
int max=0;
for(int i=0;i<=k;i++) //最大值
{
if(brr[i]>max)
max=brr[i];
}
int sum=0;
for(int i=1;i<=k;i++) //个数
{
if(brr[i]==max)
sum++;
}
cout<<max<<' '<<sum;
}