杭电2018多校第一场

A . Maximum Multiple

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6298

  • n = x + y + z; 设 n = ax = by = cz,则1/a + 1/b + 1/c = 1,可以推出当n % 3 == 0 和当 n % 4 == 0时成立,这时a,b,c分别为3,3,3和2,4,4 。

code:

// zyc 2018/7/23

#include <bits/stdc++.h>
using namespace std;

int main ()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    long long t; cin >> t;
    while (t --) {
        long long n; cin >> n;
        if (n % 3 == 0) {
            cout << n / 3 * n / 3 * n / 3 << endl;
        } else if (n % 4 == 0) {
            cout << n / 2 * n / 4 * n / 4 << endl;
        } else {
            cout << -1 << endl;
        }
    }
    return 0;
}

C . Triangle Partition

题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6300

  • 按照x坐标排序,贪心的每次选取最右边三个点,可以保证一定不相交。

code:

// zyc 2018/7/23

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e4 + 7;

struct node {
    int x, y;
    int id;
} a[maxn];
bool cmp (node &k, node &l) {
    return k.x < l.x;
}
int main ()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int t; scanf ("%d", &t);
    while (t --) {
        int n; scanf ("%d", &n);
        for (int i = 0; i < n * 3; i ++) {
            scanf ("%d %d", &a[i].x, &a[i].y);
            a[i].id = i + 1;
        }
        sort (a, a + n * 3, cmp);
        for (int i = 0; i < n; i ++) {
            printf("%d %d %d\n", a[i * 3].id, a[i * 3 + 1].id, a[i * 3 + 2].id);
        }
    }
    return 0;
}

K . Time Zone

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6308

  • %f 输入X.Y,将其表示为分钟,转化为整型。直接加上去输出即可。

code:

// zyc 2018/7/23

#include <bits/stdc++.h>
using namespace std;


int main ()
{
    int n; scanf ("%d", &n);
    while (n --) {
        int k, l; float data;
        scanf ("%d %d UTC%f", &k, &l, &data);
        data -= 8;
        data *= 60;
        if (data > -0.01) {
            l += (int)(data + 0.5);
        } else {
            l += (int)(data - 0.5);
        }
        while (l < 0) {l += 60; k --;}
        while (l >= 60) {l -= 60; k ++;}
        while (k < 0) k += 24;
        k %= 24;
        printf("%02d:%02d\n", k, l);
    }
    return 0;
}

D . Distinct Values

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6301

  • 记录下每个点的最小区间左端点,set维护可以使用的值,贪心跑一遍

code:

// zyc 2018/7/23

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 7;
const int M = 1e9 + 7;

int main ()
{
    int t; scanf ("%d", &t);
    while (t --) {
        int n, m; scanf ("%d %d", &n, &m);
        int pre [maxn], ans[maxn]; int l, r;
        for (int i = 1; i <= n; i ++) pre [i] = i;
        for (int i = 1; i <= m; i ++) {
            scanf ("%d %d", &l, &r);
            pre[r] = min (pre[r], l);
        }
        // puts ("1 2 3 4 5 6 7 8 9 10 11 12");
        // for (int i = 1; i <= n; i ++) printf ("%d%c", pre[i], (i == n) ? '\n' : ' ');
        for (int i = n - 1; i >= 1; i --) pre [i] = min (pre [i], pre [i + 1]);
        // for (int i = 1; i <= n; i ++) printf ("%d%c", pre[i], (i == n) ? '\n' : ' ');
        int res = 1; set <int> s;
        for (int i = 1; i <= n; i ++) s.insert (i);
        for (int i = 1; i <= n; i ++) {
            while (res < pre [i]) {
                s.insert (ans [res]);
                res ++;
            }
            ans [i] = *s.begin ();
            s.erase (ans[i]);
        }
        for (int i = 1; i <= n; i ++) printf ("%d%c", ans[i], (i == n) ? '\n' : ' ');
    }
    return 0;
}

待更新...

猜你喜欢

转载自blog.csdn.net/calculus_a/article/details/81175653