BZOJ 2257 [Jsoi2009]瓶子和燃料

来源:互联网 发布:访问nginx 403 编辑:程序博客网 时间:2024/04/28 06:47

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2257

题意:给定n个瓶子的容量,选出其中k个,最大化k个瓶子之间无度量所能表达的最小体积。kn1000,容量109

题解:
考虑两个瓶子(容量为ab),互相倒来倒去能表示的体积都是以两个瓶子容量生成的值ax+by,而(a,b)|ax+by,所以最小体积就是(a,b),推广到k个瓶子,题目即最大化k个瓶子的最大公因数。
考虑将每个数分解因数,找最大且出现至少k次的因数即可。
不考虑map的时间复杂度为O(nmax{V})

代码:

#include <map>#include <cstdio>#include <algorithm>using namespace std;map<int, int> cnt;int n, k, x, i;int main(){    scanf("%d%d", &n, &k);    while(n--)    {        scanf("%d", &x);        for(i = 1; i * i < x; ++i)            if(x % i == 0) ++cnt[i], ++cnt[x / i];        if(i * i == x) ++cnt[i];    }    map<int, int>::iterator it = cnt.end(), jt = cnt.begin();    for(--it, --jt; it != jt; --it)        if(it -> second >= k)        {            printf("%d\n", it -> first);            break;        }    return 0;}
0 0
原创粉丝点击