• Codeforces Round #699 (Div. 2) A~C题解


    写在前边

    链接:Codeforces Round #699 (Div. 2)
    好自闭哈哈,(B)题暴力fst了,第二天改了一个字母就A了,第3题写了一个小时,然后又调了三四个小时,看不到样例,最终放弃,不过看了官方代码后也大体知道哪错了,对于(res[m])要单独算,不然会被覆盖的。

    A Space Navigation

    链接:A题链接

    题目大意:

    给定一个字符串,终点((x, y)),每个字母都表示向一个方向走一步,并且可以任意删除掉一些字母,问是否能从((0, 0))走到终点((x, y))

    思路

    只需要根据字符串的操作,计算出在(x)轴或者(y)轴上活动的范围即可。

    代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    #include <unordered_map>
    
    using namespace std;
    
    #define Inf 0x3f3f3f3f
    #define PII pair<int, int>
    #define P2LL pair<long long, long long>
    #define endl '
    '
    
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef vector<long long> VLL;
    typedef vector<int> VI;
    
    void solve() {
        int x, y;
        cin >> x >> y;
        string s;
        cin >> s;
        int l = 0, u = 0, r = 0, d = 0;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == 'L') l--;
            else if (s[i] == 'U') u++;
            else if (s[i] == 'R') r++;
            else if (s[i] == 'D') d--;
        }
        if (x <= r && x >= l && y <= u && y >= d) puts("YES");
        else puts("NO");
    }
    
    int main()
    {
        //ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
        int t;
        scanf("%d", &t);
        while (t--) {
            solve();   
        }
       
        return 0;
    } 
    

    B. New Colony

    链接:B题链接

    题目大意:

    给定一组高度不一的山,从左边数第一座山滚石头,石头能第(i)坐山滚到第(i+ 1)座山的条件是,(h_{i+1} <= h_{i}),否则石头从第(i)座山落下,同时(h_{i} += 1),问最后一颗石头会落在第几座山,如果能完美通过每一座山那么输出(-1)

    思路

    只接暴力模拟每一颗石头即可,一开始看到(1e9),就模拟了山脉,写的贼麻烦,今天发现,山最高才(100)。。。。

    代码:

    模拟山脉

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    
    using namespace std;
    
    #define Inf 0x3f3f3f3f
    #define PII pair<int, int>
    #define P2LL pair<long long, long long>
    #define endl '
    '
    
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef vector<long long> VLL;
    typedef vector<int> VI;
    
    const int N = 110;
    int h[N], ch[N];
    
    void solve() {
        memset(h, 0, sizeof h);
        int n, k;
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {
            cin >> h[i];
        }
        
        for (int i = 1; i < n; i++) {
            while (h[i] < h[i + 1]) {
                int max = h[i + 1];
                for (int j = i; j >= 1; j--) {
                    int temp = h[j + 1] - h[j];
                    if (h[j] < h[j + 1]) {
                        if (h[j] + temp - h[j - 1] > 1 && j - 1 != 0) { 
                            k -= (h[j - 1] + 1 - h[j]);
                            h[j] = h[j - 1] + 1;
                        }
                        else {
                            h[j] += temp;
                            k -= temp;
                        }
                    }      
                    if (k <= 0) {
                        cout << j << endl;
                        return;
                    }
                }
            }
        }
        puts("-1");
    }
    
    int main()
    {
        //ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
        int t;
        scanf("%d", &t);
        while (t--) {
            solve();
        }
        system("pause");
        return 0;
    }
    

    模拟石头

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    
    using namespace std;
    
    #define Inf 0x3f3f3f3f
    #define PII pair<int, int>
    #define P2LL pair<long long, long long>
    #define endl '
    '
    
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef vector<long long> VLL;
    typedef vector<int> VI;
    
    int h[110];
    
    void solve() {
        int n, k;
        cin >> n >> k;
        for (int i = 1; i <= n; i++) {
            cin >> h[i];
        }
        int res = -1;
        while (k) {
            bool flag = false;
            for (int i = 1; i <= n - 1; i++) {
                if (h[i] < h[i + 1]) {
                    k--;
                    res = i;
                    h[i] += 1;
                    flag = true;
                    break;
                }
            }
            if (!flag) {
                cout << res << endl;
                return;
            }
        }
        puts("-1");
    }
    
    int main()
    {
        //ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
        int t;
        scanf("%d", &t);
        while (t--) {
            solve();   
        }
        system("pause");
        return 0;
    } 
    

    C Fence Painting

    链接:C题链接

    题目大意:

    工匠师傅给篱笆染色,并且工匠师傅有先后没人携带一种染色,无论如何不能拒绝他,即他一定会染一次色,问是现在的篱笆经过工匠师傅染色后是否能达到目标。

    思路

    首先重要的一点是最后一个染色的师傅,假如他携带的颜色为(c_m),它可以给第(k)个位置的篱笆(a_k)染成(b_k),可以发现因为它是最后一个染色的,所以它可以覆盖原来第(k)个位置上的所有颜色,同时他还不会被改变因为他是最后一个,所以对于那些用不到的颜色我们可以通通涂到第(k)个位置,最后被最后一个染色师傅覆盖掉,剩下的就是代码实现了。

    然后发现我们既需要存每个师傅可以染色的坐标,又要存一个颜色有多少个师傅携带,要实现这一点我们可以利用map<int, vector<int>>来存,或者vector<int> g[N],这里用中括号(不是圆括号)初始化的意义是有Nvector数组,用完一个师傅则(pop_back())

    同时注意对于最后一个师傅可以涂的位置我们单独赋值,否则会在计算过程中被覆盖。

    代码:

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    #include <map>
    #include <cstring>
    
    using namespace std;
    
    #define Inf 0x3f3f3f3f
    #define PII pair<int, int>
    #define P2LL pair<long long, long long>
    #define endl '
    '
    
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef vector<long long> VLL;
    typedef vector<int> VI;
    
    const int N = 1e5 + 10;
    int a[N], b[N], c[N];
    int res[N];
    int n, m;
    
    void solve() {
        map<int, VI> cnt;
        scanf("%d%d", &n, &m);
        for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
        for (int i = 1; i <= n; i++) {
            scanf("%d", &b[i]);
            if (b[i] != a[i]) {
                cnt[b[i]].push_back(i);
            }
        }
        for (int i = 1; i <= m; i++) scanf("%d", &c[i]);
    
        int last = -1;
        if (cnt[c[m]].size()) {
            last = cnt[c[m]].back();
            cnt[c[m]].pop_back();
        }
        else {
            for (int i = 1; i <= n; i++) { //记录最后一个工匠师傅可以染色的位置
                if (b[i] == c[m]) {
                    last = i;
                }
            }
        }
    
        if (last == -1) {
            puts("NO");
            return;
        }
    
        res[m] = last;
        for (int i = 1; i <= m - 1; i++) {
            if (cnt[c[i]].size() == 0) {
                res[i] = last;
            }
            else {
                res[i] = cnt[c[i]].back();
                cnt[c[i]].pop_back();
            }
        }
    
        for (auto it : cnt) {
            if (it.second.size()) {
                puts("NO");
                return;
            }
        }
        puts("YES");
        for (int i = 1; i <= m; i++) {
            cout << res[i] << " ";
        }
        puts("");
    }
    
    int main()
    {
        //ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
        int t;
        scanf("%d", &t);
        while (t--) {
            solve();
        }
    
        return 0;
    }
    
  • 相关阅读:
    python解析网页
    node.js 爬虫
    c++ split实现
    foldl foldr
    爬虫http header gzip
    命令[10]
    命令[08]
    命令[15]
    命令[13]
    命令[11]
  • 原文地址:https://www.cnblogs.com/ZhengLijie/p/14381707.html
Copyright © 2020-2023  润新知