[JSOI2009]瓶子和燃料

传送机

 给你$n$个有容量的瓶子 , 从中取出$k$个 , 使得取出的瓶子所能表达出的最小体积最大

根据裴蜀定理 , $k$个瓶子所可表达出的最小体积是其$Gcd$

找出$n$个桶子的因子出现次数 , 去最大的出现次数大于等于$k$的记为答案

$map$储存即可

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <map>
 6 #include <cmath>
 7 #define inc(i) (++ (i))
 8 #define dec(i) (-- (i))
 9 using namespace std;
10 
11 const int N = 1000 + 7;
12 int n , k , A , Ans;
13 map <int , int> M;
14 
15 int main()
16 {
17     scanf("%d%d" , &n , &k);
18     for(int i = 1 ; i <= n ; inc(i))
19     {
20         scanf("%d" , &A);
21         for(int j = 1 , Max = sqrt(A) ; j <= Max ; inc(j))
22             if(A % j == 0)
23             {
24                 inc(M[j]) , inc(M[A / j]);
25                 if(M[j] >= k) Ans = max(Ans , j);
26                 if(M[A / j] >= k) Ans = max(Ans , A / j);
27             }
28     }
29     printf("%d" , Ans);
30     return 0;
31 }
JSOI2009
 

猜你喜欢

转载自www.cnblogs.com/Shine-Sky/p/9651123.html