2019 年百度之星·程序设计大赛 - 初赛一 1001,1002,1003,1005

题目链接:Polynomial

/*
 * [链接]:
 *
 * [题意]:计算n次多项式趋近与无穷时的极限。
 * [分析]:看最高次即可。
 *
 * [tricks]:
 *
 * [时间复杂度]:
 *
 * */

#include 

#define  ll long long
#define all(x) (x).begin(),(x).end()
using namespace std;

void scan() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
}

const int maxn = 1e6 + 7;
ll a[maxn], b[maxn];


int main() {
    scan();
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int t;
    cin >> t;
    while (t--) {
        int n;
        cin >> n;
        for (int i = 1; i <= n; i++) cin >> a[i];
        for (int i = 1; i <= n; i++) cin >> b[i];
        for (int i = n; i >= 1; i--) {
            if (a[i] == 0 && b[i] == 0) continue;
            if (a[i] == 0 && b[i]) cout << "0/1" << endl;
            else if (b[i] == 0 && a[i]) cout << "1/0" << endl;
            else if (a[i] && b[i]) {
                cout << (a[i] / __gcd(a[i], b[i])) << "/" << b[i] / __gcd(a[i], b[i]) << endl;
            }
            goto ed;
        }
        ed:;
    }
    return 0;
}

题目链接:Game

 

/*
 * [链接]:http://acm.hdu.edu.cn/showproblem.php?pid=6669
 *
 * [题意]:中文题面
 *
 * [分析]:枚举每一个可能的起始点,由于每次可以选择走一步或者两步。
 *
 * 因此需要记录好每个点从起始点到当前位置前,后所需的步数。
 *
 * [tricks]:
 *
 * [时间复杂度]:t*(2*n)*(6*n)
 *
 * */

#include 

#define  ll long long
#define all(x) (x).begin(),(x).end()
using namespace std;

void scan() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
}

const int maxn = 1e6 + 7;


struct node {
    int l, r;
} a[maxn];

int point[maxn], cnt, n;

ll gao(int x) {
    ll ret = -1;
    int now[6], nxt[6];
    memset(now, 0, sizeof(now));
    for (int i = 0; i < n; i++) {
        int l = a[i].l, r = a[i].r;
        if (l <= x && x <= r) {
            if (l == x) now[0] = -1;
            if (r == x) now[2] = -1;
        } else {
            int goal = l;
            if (x > r) goal = r;
            memset(nxt, -1, sizeof(nxt));
            for (int dx = 0; dx < 3; dx++) {
                if (now[dx] == -1) continue;
                for (int dy = 0; dy < 3; dy++) {
                    int ox = x + dx - 1, nx = goal + dy - 1;
                    if (l <= nx && nx <= r) {
                        int v = now[dx] + (fabs(nx - ox) + 1) / 2;
                        if (nxt[dy] == -1 || nxt[dy] > v) nxt[dy] = v;
                    }
                }
            }
            x = goal;
            memcpy(now, nxt, sizeof(now));
        }
    }
    for (int i = 0; i < 3; i++) {
        if (now[i] != -1 && (ret == -1 || ret > now[i]))
            ret = max(now[i] * 1ll, ret);
    }
    return ret;
}

int main() {
    scan();
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    int t;
    cin >> t;
    while (t--) {
        cin >> n;
        cnt = 0;
        for (int i = 0; i < n; i++) {
            cin >> a[i].l >> a[i].r;
            point[cnt++] = a[i].l, point[cnt++] = a[i].r;
        }
        sort(point, point + cnt);
        cnt = unique(point, point + cnt) - point;

        ll ans = 1e18;

        for (int i = 0; i < cnt; i++) ans = min(gao(point[i]), ans);
        cout << ans << endl;
    }
    return 0;
}

 

题目链接:Seq

/*
 * [链接]:
 *
 * [题意]:找第n项,打表即可。
 * [分析]:
 *
 * [tricks]:
 *
 * [时间复杂度]:
 *
 * */

#include 

#define  ll long long
#define all(x) (x).begin(),(x).end()
using namespace std;

void scan() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
}

const int maxn = 1e6 + 7;
ll a[maxn], b[maxn];


ll fir[6] = {3, 1, 1, 0, 3, 0};

ll base[6] = {3, 4, 3, 1, 6, 1};


int main() {
    scan();
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);

    int t;
    cin >> t;
    while (t--) {
        ll n;
        cin >> n;
        cout << (fir[n % 6] + base[n % 6] * ((n - 1) / 6)) << endl;
    }



//    4 3 1 6 1 3

//    1,1,0,3,0,3,
//    5,4,1,9,1,6,
//    9,7,2,15,2,9,
//    13,10,3,21,3,12,
//    17,13,4,27,4,15,

//    int t;
//    cin >> t;
//    while (t--) {
//        ll n;
//        cin >> n;
//
//    }
    return 0;
}

题目链接:Mindis

#include 

#define  ll long long
#define all(x) (x).begin(),(x).end()
using namespace std;

void scan() {
#ifndef ONLINE_JUDGE
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif
}

const int maxn = 250;
const int MAXM = 405;

int px[maxn * 2], py[maxn * 2], ix, iy, n;
int Ax, Ay, Bx, By;
struct Rectangle {
    int l, r, t, b;
} rec[maxn];
int sped[MAXM * MAXM][4];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};

struct Node {
    double d, x, y;

    Node() {}

    Node(double _d, int _x, int _y) {
        d = _d;
        x = _x;
        y = _y;
    }

    bool operator<(const Node &a) const {
        return d > a.d;
    }
};

priority_queue que;
double dist[MAXM * MAXM];
bool vis[MAXM * MAXM];

int findX(int x) { return lower_bound(px, px + ix, x) - px; }

int findY(int x) { return lower_bound(py, py + iy, x) - py; }

inline int Abs(int x) {
    if (x < 0) return -x;
    return x;
}

inline int check(int a, int b, int c, int d, int i) {
    if (!(rec[i].l <= a && a <= rec[i].r && rec[i].b <= b && b <= rec[i].t)) return 0;
    if (!(rec[i].l <= c && c <= rec[i].r && rec[i].b <= d && d <= rec[i].t)) return 0;
    return 1;
}

inline void solve(int T) {
    scanf("%d", &n);

    ix = iy = 0;
    for (int i = 0; i < n; i++) {
        scanf("%d %d %d %d", &rec[i].l, &rec[i].b, &rec[i].r, &rec[i].t);
        px[ix++] = rec[i].l;
        px[ix++] = rec[i].r;
        py[iy++] = rec[i].b;
        py[iy++] = rec[i].t;
    }

    scanf("%d %d %d %d", &Ax, &Ay, &Bx, &By);
    int INF = Abs(Ax - Bx) + Abs(Ay - By);
    px[ix++] = Ax;
    px[ix++] = Bx;
    py[iy++] = Ay;
    py[iy++] = By;

    sort(px, px + ix);
    sort(py, py + iy);
    ix = unique(px, px + ix) - px;
    iy = unique(py, py + iy) - py;

    Ax = findX(Ax);
    Bx = findX(Bx);
    Ay = findY(Ay);
    By = findY(By);
    for (int i = 0; i < n; i++) {
        rec[i].l = findX(rec[i].l);
        rec[i].r = findX(rec[i].r);
        rec[i].b = findY(rec[i].b);
        rec[i].t = findY(rec[i].t);
    }

    memset(sped, 0, sizeof(sped));
    for (int i = 0; i < ix; i++) {
        for (int j = 0; j < iy; j++) {
            for (int k = 0; k < 4; k++) {
                int ni = i + dx[k], nj = j + dy[k];
                int cnt = 0;
                if (0 <= ni && ni < ix && 0 <= nj && nj < iy) {
                    for (int p = 0; p < n; p++) cnt += check(i, j, ni, nj, p);
                }
                sped[i * iy + j][k] = cnt;
            }
        }
    }

    int tot = ix * iy;
    for (int i = 0; i < tot; i++) dist[i] = INF;
    dist[Ax * iy + Ay] = 0;
    memset(vis, false, sizeof(vis));
    while (!que.empty()) que.pop();
    que.push(Node(0, Ax, Ay));

    while (!que.empty()) {
        Node now = que.top();
        que.pop();
        int x = now.x, y = now.y, idx = x * iy + y;
        if (vis[idx]) continue;
        vis[idx] = true;
        for (int k = 0; k < 4; k++) {
            int nx = x + dx[k], ny = y + dy[k];
            if (0 <= nx && nx < ix && 0 <= ny && ny < iy) {
                int nidx = nx * iy + ny;
                int s = sped[idx][k] + 1, l = Abs(px[nx] - px[x]) + Abs(py[ny] - py[y]);
                double t = (double) l / (double) s;
                if (dist[nidx] > dist[idx] + t) {
                    dist[nidx] = dist[idx] + t;
                    que.push(Node(dist[nidx], nx, ny));
                }
            }
        }
    }

    printf("%.5f\n", dist[Bx * iy + By]);
}

int main() {
    scan();
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    int T = 0;
    scanf("%d", &T);
    for (int i = 1; i <= T; i++) solve(i);
    return 0;
}

 

你可能感兴趣的:(记录)