码迷,mamicode.com
首页 > 其他好文 > 详细

2019 HDOJ Multi-University Training Contest Stage 8(杭电多校)

时间:2019-08-15 01:01:58      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:规律   题解   平面   ++   ace   std   color   找规律   rectangle   

中规中矩的一场。

题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=855


C:

定义函数f(d,k)为数字d在数字k中出现的次数。给定d和x,找到尽量大的k使得k<=x且f(d,k)==k。

很诡异的一题,最好的做法仍然是打表找规律。题解给了一个很神奇的结论:满足条件的k<1011且k的分布非常稀疏。

技术图片
 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const ll m = 1e5, maxn = 1e6 + 10;
21 ll a[maxn][10], ans[10][maxn], cnt[10];
22 
23 bool check(ll x, ll y) {
24     if (x < 0 && y >= 0) return 1;
25     if (x > y && x >= 0 && x < m) return 1;
26     return 0;
27 }
28 
29 int main() {
30     for (int i = 1; i < m * 10; i++) {
31         for (int j = 0; j < 10; j++) a[i][j] = a[i / 10][j];
32         a[i][i % 10]++;
33     }
34     for (int d = 1; d < 10; d++) {
35         int r = 1;
36         for (int i = 0; i < m * d; i++)
37             if (check(r, r - m / 2 + m * a[i][d])) {
38                 for (int j = 0; j < m; j++) {
39                     r += a[i][d] + a[j][d] - 1;
40                     if (!r) ans[d][cnt[d]++] = m * i + j;
41                 }
42             } else r += m * a[i][d] - m / 2;
43     }
44     int query; scanf("%d", &query);
45     while (query--) {
46         int d; ll k; scanf("%d%lld", &d, &k);
47         int r = cnt[d] - 1;
48         while (r >= 0 && ans[d][r] > k) r--;
49         if (r >= 0) printf("%lld\n", ans[d][r]);
50         else puts("0");
51     }
52     return 0;
53 }
View Code

I:

给定两个矩形的左上角和右下角坐标,问这两个矩形把平面分成几个区域。

离散化是重点。

技术图片
/* Codeforces Contest 2019_mutc_08
 * Problem I
 * Au: SJoshua
 */
#include <set>
#include <unordered_map>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

bool board[20][20];

const int movement[4][2] = {
    {0, -1}, {0, 1}, {1, 0}, {-1, 0}
};

struct node {
    int x, y;
};

struct Rectangle {
    int x1, y1, x2, y2;
    void fill(void) {
        for (int x = x1; x <= x2; x++) {
            board[x][y1] = board[x][y2] = true;
        }
        for (int y = y1; y <= y2; y++) {
            board[x1][y] = board[x2][y] = true;
        }
    }
};

void init(void) {
    memset(board, 0, sizeof(board));
}

int calc(void) {
    int ans = 0;
    for (int i = 0; i < 20; i++) {
        for (int j = 0; j < 20; j++) {
            if (!board[i][j]) {
                queue <node> info;
                info.push({i, j});
                while (!info.empty()) {
                    auto t = info.front();
                    info.pop();
                    if (board[t.x][t.y]) {
                        continue;
                    }
                    board[t.x][t.y] = true;
                    for (int k = 0; k < 4; k++) {
                        int nx = t.x + movement[k][0], ny = t.y + movement[k][1];
                        if (0 <= nx && nx < 20 && 0 <= ny && ny < 20 && !board[nx][ny]) {
                            info.push({nx, ny});
                        }
                    }
                }
                ans++;
            }
        }
    }
    return ans;
}

int main(void) {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    int T;
    cin >> T;
    while (T--) {
        vector <int> vec(8);
        set <int> hash;
        unordered_map <int, int> mp;
        for (int i = 0; i < 8; i++) {
            cin >> vec[i];
            hash.insert(vec[i]);
        }
        int cur = 1;
        for (auto e : hash) {
            mp[e] = cur;
            cur += 2;
        }
        Rectangle A = {mp[vec[0]], mp[vec[1]], mp[vec[2]], mp[vec[3]]};
        Rectangle B = {mp[vec[4]], mp[vec[5]], mp[vec[6]], mp[vec[7]]};
        init();
        A.fill();
        B.fill();
        cout << calc() << endl;
    }
    return 0;
}
Code via. Sjoshua

J:

签到题,水题。

技术图片
 1 /* Codeforces Contest 2019_mutc_08
 2  * Problem J
 3  * Au: SJoshua
 4  */
 5 #include <cstdio>
 6 #include <vector>
 7 #include <string>
 8 #include <iostream>
 9 #include <algorithm>
10 
11 using namespace std;
12 
13 struct info {
14     string name;
15     int score, penalty;
16 };
17 
18 int main(void) {
19     std::ios::sync_with_stdio(false);
20     std::cin.tie(0);
21     int T;
22     cin >> T;
23     while (T--) {
24         int n, d;
25         cin >> n >> d;
26         vector <info> board(n);
27         for (int i = 0; i < n; i++) {
28             cin >> board[i].name >> board[i].score >> board[i].penalty;
29         }
30         sort(board.begin(), board.end(), [](info & a, info & b)->bool {
31             return a.score == b.score ? a.penalty < b.penalty : a.score > b.score;
32         });
33         d *= 10;
34         if ((n * d) % 100 == 50) {
35             cout << board[(n * d) / 100].name << endl;
36         } else {
37             cout << "Quailty is very great" << endl;
38         }
39     }
40     return 0;
41 }
Code via. Sjoshua

K:

有n个班级,一个班有ai个人并准备了bi杯奶茶。每个人只能喝一杯奶茶,而且不能喝本班的奶茶。问最多有多少人能喝奶茶。

按班级人数从大到小排序,然后对于第i个班,从第i+1个班开始绕一圈喝奶茶即可。

技术图片
 1 /* Codeforces Contest 2019_mutc_08
 2  * Problem K
 3  * Au: SJoshua
 4  */
 5 #include <queue>
 6 #include <cstdio>
 7 #include <vector>
 8 #include <string>
 9 #include <list>
10 #include <iostream>
11 #include <algorithm>
12 
13 using namespace std;
14 
15 struct _Class {
16     int num, tea;
17 };
18 
19 int main(void) {
20     std::ios::sync_with_stdio(false);
21     std::cin.tie(0);
22     int T; cin >> T;
23     while (T--) {
24         int n; cin >> n;
25         vector <_Class> _class(n);
26         for (int i = 0; i < n; i++) {
27             cin >> _class[i].num >> _class[i].tea;
28         }
29         sort(_class.begin(), _class.end(), [](_Class & a, _Class & b) {
30             return a.tea == b.tea ? a.num > b.num : a.tea > b.tea;
31         });
32         long long int ans = 0;
33         vector <int> nxt(n);
34         for (int i = 0; i < n - 1; i++) nxt[i] = i + 1;
35         nxt[n - 1] = 0;
36         for (int i = 0; i < n; i++) {
37             int nxt = i;
38             long long int cnt = 0, round = 0;
39             while (_class[i].num) {
40                 round++;
41                 int last = nxt; nxt = nxt[nxt];
42                 if (nxt == i) break;
43                 if (_class[nxt].tea) {
44                     int drink = min(_class[nxt].tea, _class[i].num);
45                     _class[i].num -= drink, _class[nxt].tea -= drink;
46                     ans += drink, cnt += drink;
47                 } else nxt[last] = nxt[nxt];
48                 if (round > n) break;
49             }
50             if (!cnt && _class[i].num) break;
51         }
52         cout << ans << endl;
53     }
54     return 0;
55 }
Code via. Sjoshua

 

2019 HDOJ Multi-University Training Contest Stage 8(杭电多校)

标签:规律   题解   平面   ++   ace   std   color   找规律   rectangle   

原文地址:https://www.cnblogs.com/JHSeng/p/11354513.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!