【立体几何】分类讨论很细节 Gym

http://codeforces.com/gym/101967/attachments

题意:定义了一个甜甜圈。(torus)

不是让你二重积分啦233

现在有一个星球是甜甜圈形状的,它有四条很关键的纬线,南极北极里赤道外赤道。同时有n条均匀分布的经线。每一圈经线和四条和纬线交出四个点。现在你从内赤道的某圈经线上出发,沿着经纬线访问所有的经线,访问的意思是:对于每个经线,至少走过其与两条纬线的交点。

题解:照着样例摸一下,不用算法,只是很细节。

#include <iostream>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cmath>
#include<cstdio>
#include<vector>
#include<ctime>
#include<string>
#define rep(i,t,n)  for(int i =(t);i<=(n);++i)
#define per(i,n,t)  for(int i =(n);i>=(t);--i)
#define mmm(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
const double PI = acos(-1.0);

int main()
{
    double r, R;
    int n;
    scanf("%lf%lf%d", &r, &R, &n);
    int N = n;
    double inner =  PI * 2 *(R-r)/n;
    double onner =  PI * 2 *(R)/n;
    double lesser = PI * 2 * r/4;
    double ans = 0;
    if (N == 1) {
        printf("%.15lf
",lesser);
        return 0;
    }

    if (lesser*4+inner*2 < lesser*2+onner+inner) {
        ans = lesser*2;
        ans += (N-1)*(lesser*2+inner);
        ans -= lesser;
    }
    else {
        if (N&1==1) {
            int t = N-3;
            ans = lesser*3+onner+inner;
            ans += (t/2)*(lesser*2+inner+onner);
        }else {
            int t = N-2;
            ans = min(lesser*2+onner,lesser*3+inner);
            ans += (t/2)*(lesser*2+inner+onner);
        }
    }
    printf("%.15lf
", ans);
}
成功的路并不拥挤,因为大部分人都在颓(笑)
原文地址:https://www.cnblogs.com/SuuT/p/9943045.html