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;
}
原文地址:https://www.cnblogs.com/Lyush/p/2954622.html