2020-team2-paste

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int n, d, s, t, fmn, fmx;
vector<double> ans;
int vis[N];
inline int Sqr(int x) {
    return x * x;
}
inline double Calc(int k) {
    return sqrt(Sqr(k * d) + Sqr(s));
}
inline void Dfs(int x, int num, double len) {
    if (num == n - 1) {
        ans.push_back(len + Calc(n - x) * 2);
        return;
    }
    if (x > 1 && !vis[x - 1]) {
        vis[x - 1] = 1;
        Dfs(x - 1, num + 1, len + d * 2);
        vis[x - 1] = 0;
    }
    if (x + 1 < n && !vis[x + 1]) {
        vis[x + 1] = 1;
        Dfs(x + 1, num + 1, len + d * 2);
        vis[x + 1] = 0;
    }
    for (int i = 1; i < n; ++i) if (!vis[i]) {
        vis[i] = 1;
        Dfs(i, num + 1, len + Calc(i - x) * 2);
        vis[i] = 0;
    }
}
int main() {
    scanf("%d%d%d%d%d%d", &n, &d, &s, &t, &fmn, &fmx);
    vis[1] = 1;
    Dfs(1, 1, s + t * 2 * n);
    int len;
    for (auto x: ans) printf("%.10lf\n", x);
    while (scanf("%d", &len)) {
        int tmp = upper_bound(ans.begin(), ans.end(), len - 2 * fmn) - lower_bound(ans.begin(), ans.end(), len - 2 * fmx);
        printf("%d\n", tmp);
    }
    return 0;
}
/*
3 10 25 3 125 175
485
410
116.8516480713
150.7032961427
*/

#include

using namespace std;

const int N = 100;

int n, d, s, t, fmn, fmx;

vector ans;

int vis[N];

inline int Sqr(int x) {

return x * x;

}

inline double Calc(int k) {

return sqrt(Sqr(k * d) + Sqr(s));

}

inline void Dfs(int x, int num, double len) {

if (num == n - 1) {

ans.push_back(len + Calc(n - x) * 2);

return;

}

if (x > 1 && !vis[x - 1]) {

vis[x - 1] = 1;

Dfs(x - 1, num + 1, len + d * 2);

vis[x - 1] = 0;

}

if (x + 1 < n && !vis[x + 1]) {

vis[x + 1] = 1;

Dfs(x + 1, num + 1, len + d * 2);

vis[x + 1] = 0;

}

for (int i = 1; i < n; ++i) if (!vis[i]) {

vis[i] = 1;

Dfs(i, num + 1, len + Calc(i - x) * 2);

vis[i] = 0;

}

}

int main() {

scanf("%d%d%d%d%d%d", &n, &d, &s, &t, &fmn, &fmx);

vis[1] = 1;

Dfs(1, 1, s + t * 2 * n);

int len;

for (auto x: ans) printf("%.10lf\n", x);

while (scanf("%d", &len)) {

int tmp = upper_bound(ans.begin(), ans.end(), len - 2 * fmn) - lower_bound(ans.begin(), ans.end(), len - 2 * fmx);

printf("%d\n", tmp);

}

return 0;

}

/*

3 10 25 3 125 175

485

410

116.8516480713

150.7032961427

*/

附加文件