本文主要是介绍HDU 2566 统计硬币(O(m^3)枚举+优化成O(m)),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
统计硬币
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
23 54 8
12
可以暴力AC,复杂度O(m^3)
但是仔细分析后发现:如果n个硬币全都是1或2,能组成[n,2n]区间内任何一个数。
所以枚举面额为5的硬币个数,然后计算剩下的面额是否在剩下的1、2硬币组成的面额区间内。
优化后的复杂度:O(m)
完整代码:
暴力:(暴力都能0ms,orz。。)
/*0ms,268KB*/#include <cstdio>int main(void)
{int k, n, m;int one, two, five, o, t, f, count;scanf("%d", &k);while (k--){one = two = five = 0;count = 0;scanf("%d%d", &n, &m);one = m;two = m / 2;five = m / 5;///看哥暴力AC~for (f = 0; f <= five; f++)for (t = 0; t <= two; t++)for (o = 0; o <= one; o++)if ((f * 5 + t * 2 + o == m) && (f + t + o == n))count++;printf("%d\n", count);}return 0;
}
优化:
/*0ms,268KB*/#include <cstdio>int main(void)
{int k, n, m, N, M;int five_num, count;scanf("%d", &k);while (k--){scanf("%d%d", &n, &m);five_num = m / 5;if (n < five_num)//n硬币全是5分都不够mputs("0");else{count = 0;for (int i = 0; i <= five_num; ++i){M = m - i * 5;N = n - i;if (M >= N && M <= (N << 1))count++;}printf("%d\n", count);}}return 0;
}
这篇关于HDU 2566 统计硬币(O(m^3)枚举+优化成O(m))的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!