HCPC2013校赛训练赛 1
D.求体积
题意:给定一个从中间挖去了一个圆柱(上下面是球的弧面)的球,告诉了剩下圆柱的高(可以看做是球剩下的高度),求球的体积是多少。
解法:由于只给定了高度,所以存在不同半径的球都能够达到这个高度的要求,所以假设一个极端情况,那就是球的直径刚好等于已知的H,那么中间的圆柱就不用挖去了,所以剩下的就是球的体积。可惜还是不能够证明出为什么会这样。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <cstdlib> #include <iostream> #include <cmath> #include <iostream> #include <cstdio> using namespace std; const double PI = 3.1415926; int main() { double r; while (cin >> r) { r /= 2; printf("%.2f\n", 4.0/3.0*PI*r*r*r); } return 0; }
E.K倍数
题意:给定一个不同数字组成的集合,现在要求这个集合的一个子集合满足任意两个元素之间不存在K倍关系,问满足要求的子集合最多能有多少个元素。
解法:找出所有的存在K倍数关系的链。比如如果K=2,1 2如果单独成链,那么1,2就要删除一个,6 12 24三个成链的话就要删除中间一个12使得6和24都能够存在。综合,找出所有的相互之间不连接的一条x个元素的链,每条链删除x/2个元素,剩下的就是能够放置在一起的最多的元素的集合了。
代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> #include <map> using namespace std; int N, K; map<long long,bool>mp; int main() { map<long long,bool>::iterator it; int sum; while (scanf("%d %d", &N, &K) == 2) { sum = 0; mp.clear(); int c; for (int i = 0; i < N; ++i) { scanf("%d", &c); mp[c] = true; } int cnt; long long t; for (it = mp.begin(); it != mp.end(); ++it) { cnt = 0; long long t = it->first; while (mp[t]) { mp[t] = false; t = K * t; ++cnt; } sum += cnt / 2; } printf("%d\n", N - sum); } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步