zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 24-A B C D 思维

      比赛链接: https://vjudge.net/contest/179452#overview

          A: Diplomas and Certificates 水题

      代码: 

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define mem0(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,0x3f,sizeof(a))
    typedef long long ll;
    using namespace std;
    
    //const int INF = 0x3fffffff;
    
    ll n, k;
    
    int main() {
        cin >> n >> k;
        ll mw = n / 2;
        if( mw / (k+1) == 0 ) {
            cout << "0 0 " << n << endl;
            return 0;
        }
        else {
            cout << mw / (k+1) << " " << mw / (k+1) * k << " " << n-mw/(k+1)-mw/(k+1)*k << endl;
        }
        return 0;
    }
    A

          B: Permutation Game 

      题目描述: 你有一组排列, 做了m个操作, 从某个数开始跳到a[i]就一次跳a[i]个数, 问给你m组操作, 是否可以推出排列

      解题思路: 由于跳的步数等于ans[i] 所以 ans[i] = a[i+1] - a[i]  这里有一些细节需要处理一下, 还有就是这是一个排列, 所以如果一个ans[i]已经确定了, 这个ans[i]就不能再被修改, 可能还会有一些数字没有跳到, 这样就枚举从1 ~ n中没有出现过的数儿就行了, 原来以为这里还会有填充的数字比n多这个坑的, 结果没有, woc! 又犯傻比! 当时要是判定这个可就真的傻逼了, 本来就WA了两次了

      代码:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define mem0(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,0x3f,sizeof(a))
    typedef long long ll;
    using namespace std;
    
    //const int INF = 0x3fffffff;
    
    int n, m;
    int a[110];
    int ans[110];
    int vis[110];
    
    int main() {
        cin >> n >> m;
        memset(a, -1, sizeof(a));
        memset(ans, -1, sizeof(ans));
        mem0(vis);
        for( int i = 1; i <= m; i++ ) {
            cin >> a[i];
        }
        for( int i = 1; i < m; i++ ) {
            int temp = a[i+1] - a[i];
            
            if( temp == 0 ) { temp = n; /*cout << "===" << a[i] << endl; */}
            if( temp > 0 ) {}
            if( temp < 0 )  temp += n;
            if( ans[a[i]] != -1 && temp != ans[a[i]] ) {
                cout << "-1" << endl;
                return 0;
            }
            ans[a[i]] = temp;
        }
        for( int i = 1; i <= n; i++ ) {
            if( ans[i] != -1 && vis[ans[i]] > 0 ) {
                cout << "-1" << endl;
                return 0;
            }
            else if( ans[i] != -1 && vis[ans[i]] == 0 ){
                vis[ans[i]] = 1;
            }
        }
        int cnt = 1;
        for( int i = 1; i <= n; i++ ) {
            if( ans[i] == -1 ) {
                while( vis[cnt] != 0 ) {
                    cnt++;
                }
                ans[i] = cnt;
                vis[cnt] = 1;
            }
        }
        for( int i = 1; i <= n; i++ ) {
            if( i == 1 ) cout << ans[i];
            else cout << " " << ans[i];
        }
        cout << endl;
        return 0;
    }
    B

      思考: 自己在那个ans[i]已经确定但不能被改变, 但是完全可以相同啊这里WA了一次, 还有就是这个能不能被改变WA了一次

          C: 我操我没看C啊, C题面好长, 就直接看的D, 一会儿补

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define mem0(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,0x3f,sizeof(a))
    typedef long long ll;
    using namespace std;
    
    //const int INF = 0x3fffffff;
    const int maxn = 1e6 + 100;
    
    struct node {
        int x1, y1, x2, y2;
        node() {}
        void init( int _x1, int _y1, int _x2, int _y2 ) {
            x1 = _x1, x2 = _x2, y1 = _y1, y2 = _y2;
        }
    };
    
    node a[maxn];
    int xl[maxn], xr[maxn], yl[maxn], yr[maxn];
    
    int main() {
        int d, n, m;
        mem0(xl), mem0(xr), mem0(yl), mem0(yr);
        scanf( "%d%d%d", &d, &n, &m );
        for( int i = 1; i <= d; i++ ) {
            int t1, t2, t3, t4;
            scanf( "%d%d%d%d", &t1, &t2, &t3, &t4 );
            a[i].init(t1, t2, t3, t4);
            xl[min(a[i].x1, a[i].x2)]++;
            xr[max(a[i].x1, a[i].x2)]++;
            yl[min(a[i].y1, a[i].y2)]++;
            yr[max(a[i].y1, a[i].y2)]++;
        }
        int cntl, cntr, cntt, cntb;
        scanf( "%d%d%d%d", &cntl, &cntr, &cntt, &cntb );
        for( int i = 1; i <= n; i++ )  xl[i] += xl[i-1];
        for( int i = 1; i <= m; i++ )  yl[i] += yl[i-1];
        for( int i = n; i >= 1; i-- )  xr[i] += xr[i+1];
        for( int i = m; i >= 1; i-- )  yr[i] += yr[i+1];
        for( int i = 1; i <= d; i++ ) {
            int t = yl[max(a[i].y1, a[i].y2)-1];
            int b = yr[min(a[i].y1, a[i].y2)+1];
            int l = xl[max(a[i].x1, a[i].x2)-1];
            int r = xr[min(a[i].x1, a[i].x2)+1];
            if( a[i].x1 == a[i].x2 ) { // 不在同一行, 左包含了右, 右包含了左, 需要--
                l--; r--;
            }
            if( a[i].y1 == a[i].y2 ) {
                t--; b--;
            }
            if( l == cntl && r == cntr && t == cntt && b == cntb ) {
                printf( "%d
    ", i );
                return 0;
            }
        }
        printf( "-1
    " );
        return 0;
    }
    C

      挖槽, 困得不行了, C有没想到l-- , r--, t--, b--那部分, 一直得不到正确答案, 菜的要死

          D: Multicolors cars

      题目描述: 给你一组序列, 再给你一个数, 要求你选出一个在任何位置上在i位之前出现的次数都大于等于给定数的出现的次数的数

      解题思路: 如果没出现过给定数的话, 随机一个数就行了,如果给定数出现在第一个的话就直接输出-1就行, 在输入的同时统计各个字符出现的次数, 只要有一次字符c[i]不符合条件, 以后它就不用考虑了, 然后第一个满足的数直接BREAK掉就可以了, 我现在出了一点儿BUG, 代码一会儿粘贴, 总结一会儿写

      代码: 

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    #define mem0(a) memset(a,0,sizeof(a))
    #define meminf(a) memset(a,0x3f,sizeof(a))
    typedef long long ll;
    using namespace std;
    
    //const int INF = 0x3fffffff;
    const int maxn = 1e6+100;
    int a[maxn];
    int pre[maxn];
    int ans[maxn];
    
    int main() {
        mem0(a);
        mem0(pre);
        int n, A;
        scanf( "%d%d", &n, &A );
        int flag = 0;
        mem0(ans);
        for( int i = 1; i <= n; i++ ) {
            scanf( "%d", a+i );
            if( a[i] == A ) {
                flag = 1;
            }
            if( pre[a[i]] < pre[A] ) {
                ans[a[i]] = -1;
            }
            pre[a[i]]++;
        }
        if( a[1] == A ) {
            printf( "-1
    " );
            return 0;
        }
        if( flag == 1 ) {
            for( int i = 1; i <= n; i++ ) {
                if( pre[a[i]] >= pre[A] && ans[a[i]] != -1 && a[i] != A ) {
                    printf( "%d
    ", a[i] );
                    return 0;
                }
            }
            printf( "-1
    " );
            return 0;
        }
        else {
            printf( "%d
    ", a[1] );
            return 0;
        }
        
    }
    D

      思考: 刚刚健身完回来写了一发, 全删了重新写的, 就过了, 肯定之前哪儿有漏洞自己又找不到

      总结: 自己这场比赛只做出了A, B两道水题, 其实D题不难, 但是不知道卡在哪里了......当时不仔细啊 现在把C题补了吧, 今晚儿也别干别的了

  • 相关阅读:
    记录软件工程课程项目开发时遇到的各种小问题(django)
    用python实现逻辑回归
    利用KD树进行异常检测
    PyQt4入门学习笔记(五)
    PyQt4入门学习笔记(四)
    import matplolib 时出现"This probably means that tk wasn't installed properly."的解决方法
    IDEA上安装和使用checkstyle,findbugs,visualVM,PMD插件
    pycharm连接mysql数据库
    基于trie树做一个ac自动机
    用python实现最长公共子序列算法(找到所有最长公共子串)
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7374162.html
Copyright © 2011-2022 走看看