HCPC2013校赛训练赛 1
D.求体积
题意:给定一个从中间挖去了一个圆柱(上下面是球的弧面)的球,告诉了剩下圆柱的高(可以看做是球剩下的高度),求球的体积是多少。
解法:由于只给定了高度,所以存在不同半径的球都能够达到这个高度的要求,所以假设一个极端情况,那就是球的直径刚好等于已知的H,那么中间的圆柱就不用挖去了,所以剩下的就是球的体积。可惜还是不能够证明出为什么会这样。
代码如下:
Problem D
#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个元素,剩下的就是能够放置在一起的最多的元素的集合了。
代码如下:
Problem E
#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; }