BZOJ 2257 [Jsoi2009]瓶子和燃料
2015-02-27 16:39
211 查看
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2257
题意:给定n个瓶子的容量,选出其中k个,最大化k个瓶子之间无度量所能表达的最小体积。k≤n≤1000k\leq n\leq 1000,容量≤109\leq 10^9。
题解:
考虑两个瓶子(容量为
考虑将每个数分解因数,找最大且出现至少
不考虑map的时间复杂度为O(nmax{V}−−−−−−−√)O(n\sqrt{max\{V\}})。
代码:
题意:给定n个瓶子的容量,选出其中k个,最大化k个瓶子之间无度量所能表达的最小体积。k≤n≤1000k\leq n\leq 1000,容量≤109\leq 10^9。
题解:
考虑两个瓶子(容量为
a和
b),互相倒来倒去能表示的体积都是以两个瓶子容量生成的值
ax+by,而
(a,b)|ax+by,所以最小体积就是
(a,b),推广到k个瓶子,题目即最大化
k个瓶子的最大公因数。
考虑将每个数分解因数,找最大且出现至少
k次的因数即可。
不考虑map的时间复杂度为O(nmax{V}−−−−−−−√)O(n\sqrt{max\{V\}})。
代码:
[code]#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; }
相关文章推荐
- bzoj 2257: [Jsoi2009]瓶子和燃料
- 【bzoj2257】【jsoi2009】【瓶子和燃料】【裴蜀定理】
- bzoj 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
- bzoj 2257: [Jsoi2009]瓶子和燃料
- bzoj 2257: [Jsoi2009]瓶子和燃料(裴蜀定理)
- BZOJ 2257: [Jsoi2009]瓶子和燃料【数论:裴蜀定理】
- bzoj 2257: [Jsoi2009]瓶子和燃料
- BZOJ 2257 [Jsoi2009] 瓶子和燃料
- BZOJ2257: [Jsoi2009]瓶子和燃料
- 【BZOJ 2257】【JSOI 2009】瓶子和燃料 【裴蜀定理】
- bzoj2257 [Jsoi2009]瓶子和燃料
- bzoj 2257: [Jsoi2009]瓶子和燃料 (gcd+map)
- BZOJ 2257 [Jsoi2009]瓶子和燃料 裴蜀定理
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
- bzoj 2257: [Jsoi2009]瓶子和燃料
- [BZOJ2257][Jsoi2009]瓶子和燃料(数学)
- BZOJ 2257: [Jsoi2009]瓶子和燃料 裴蜀定理
- BZOJ 2257: [Jsoi2009]瓶子和燃料
- bzoj 2257[Jsoi2009]瓶子和燃料 数论/裴蜀定理
- BZOJ 2257 JSOI 2009 瓶子和燃料 数学