题目大意:给定n个瓶子,选择k个,可以随便导油,问选择k个瓶子可以导出的油数量的最小值的最大值
首先易知k个瓶子能导出的油最小值一定是k个瓶子容量的最大公因数 于是问题转化成了在n个数中选择k个 使最大公因数最大
找出n个数的所有因数 排序 找出最大的且出现次数大于等于k的输出即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 1600100
using namespace std;
int n,k;
int factors[M],tot;
void Get_Factors(int x)
{
int i;
for(i=1;i*i<x;i++)
if(x%i==0)
factors[++tot]=i,factors[++tot]=x/i;
if(i*i==x)
factors[++tot]=i;
}
int main()
{
int i,x;
cin>>n>>k;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
Get_Factors(x);
}
sort(factors+1,factors+tot+1);
int cnt=0;
for(i=tot;i;i--)
{
if(factors[i]!=factors[i+1])
cnt=0;
++cnt;
if(cnt==k)
{
printf("%d\n",factors[i]);
return 0;
}
}
}