1. 程式人生 > >2257: [Jsoi2009]瓶子和燃料

2257: [Jsoi2009]瓶子和燃料

題意:給你n個數字,然後讓你選出k個,這k個數字進行任意組合,問得到的最小結果是多少?

數學知識:

 

分析:根據題意得出數學公式:

那麼,如何在n個之中選出k個呢?其實不用選,因為直接計算各個因子,然後排序,如果第一個大於等於k就是答案。

#include<cstdio>
#include<map>
#include<cmath>
using namespace std;
map<int, int>ss;

void fun(int num){
    for (int i = 1; i <= sqrt(num); ++i){
        
if (num%i == 0){ ss[i]++; if (i != num / i)ss[num / i]++; } } } int main(){ int n, m, x; while (scanf("%d%d", &n, &m) != EOF){ while (n--){ scanf("%d", &x); fun(x); } map<int, int>::iterator it = ss.end(); ss[
0] = 0; for (--it; it != ss.begin(); --it){ // printf("%d -- %d\n", it->first, it->second); if (it->second >= m){ printf("%d\n", it->first); break; } } ss.clear(); } }