zoukankan      html  css  js  c++  java
  • Educational Codeforces Round 26

      比赛链接: http://codeforces.com/contest/837

          A: Text Volume 水

          B: Flag of Berland

      题目描述: 给你一个字符矩阵, 问能不能形成三条条纹

      解题思路: 纯细节题, 中间因为马虎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))
    using namespace std;
    
    int cnt[9];
    char g[110][110];
    
    int main() {
        mem0(cnt);
        mem0(cnt);
        int n, m;
        cin >> n >> m;
        for( int i = 1; i <= n; i++ ) {
            for( int j = 1; j <= m; j++ ) {
                cin >> g[i][j];
                if(g[i][j] == 'R') cnt[0]++;
                else if(g[i][j] == 'G') cnt[1]++;
                else cnt[2]++;
            }
        }
        if( (n%3!=0) && (m%3!=0) ) {
            cout<< "NO" << endl;
            return 0;
        }
        int flag1 = 1;
        int flag2 = 1;
        if( cnt[0] == cnt[1] && cnt[1] == cnt[2] ) {
            if( n % 3 == 0 ) {
                char temp0 = g[1][1];
                for( int i = 1; i <= n / 3; i++ ) {
                    for( int j = 1; j <= m; j++ ) {
                        if( g[i][j] != temp0 ) {
                            flag1 = 0;
                        }
                    }
                }
                char temp1 = g[n/3+1][1];
                for( int i = n/3+1; i <= 2*n/3; i++ ) {
                    for( int j = 1; j <= m; j++ ) {
                        if(g[i][j] != temp1) {
                            flag1 = 0;
                        }
                    }
                }
            }
            else flag1 =0;
            if( m % 3 == 0 ) {
    //            cout << "=" << endl;
                char temp0 = g[1][1];
                for( int i = 1; i <= n; i++ ) {
                    for( int j = 1; j <= m/3; j++ ) {
                        if(g[i][j] != temp0) {
                            flag2 = 0;
                        }
                    }
                }
                char temp1 = g[1][m/3+1];
                for( int i = 1; i <= n; i++ ) {
                    for( int j = m/3+1; j <= 2*m/3; j++ ) {
                        if(g[i][j] != temp1) {
                            flag2 = 0;
                        }
                    }
                }
            }
            else flag2 = 0;
            if(flag1 + flag2 > 0) {
    //            cout << flag1 << " " << flag2 << endl;
                cout << "YES" << endl;
                return 0;
            }
            else {
                cout << "NO" << endl;
                return 0;
            }
        }
        else {
            cout << "NO" << endl;
        }
        return 0;
    }
    B

      思考: 自己还是不够细心, 这题本来是不应该WA的

          C: Two seals 

      题目描述: 在一块长为a * b的矩形中放置两个矩形, 所选的矩形从输入的N个矩形中选, 要求必须放两个而且不能重叠, 不能超边界

      解题思路: 这题我傻逼了.....暴力就行, 开一个2 * n的数组,将旋转后的矩形也放进去, 这样可以方便一点, 然后判断两个矩形能不能放在一起, (a-y[i], b)  或者 (a, b-x[i]) 在这两个任意一个区间就可以, 一步步更新最大值即可

      代码: 

    #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))
    using namespace std;
    
    int dp[220][220][4];
    int x[220];
    int y[220];
    
    int main() {
        int n;
        int a, b;
        cin >> n >> a >> b;
        for( int i = 1; i <= 2*n; i+=2 ) {
            cin >> x[i] >> y[i];
            x[i+1] = y[i], y[i+1] = x[i];
        }
        
        int ans = 0;
        for( int i = 1; i <= 2*n; i++ ) {
            for( int j = 1; j <= 2*n; j++ ) {
                if( i != j && !((i&1)&&j==i+1) && !(!(i&1)&&j==i-1) ) {
                    int temp1 = a-y[i];
                    int temp2 = b-x[i];
                    if( x[j] <= temp1 && y[j] <= b && temp2 >= 0 ) {
                        ans = max( ans, x[i]*y[i]+x[j]*y[j] );
                    }
                    if( x[j] <= a && y[j] <= temp2 && temp1 >= 0 ) {
                        ans = max( ans, x[i]*y[i]+x[j]*y[j] );
                    }
                }
            }
        }
        cout << ans << endl;
        return 0;
    }
    C

      思考: 一开始傻逼了......去向用DP做, 状态转移方程半天没有想出来, 原因就是DP的时候如果是当前是第j个, 就必须知道上一个是放了一个还是没放, 很复杂, 再说n这么小不暴力傻逼啊

      

      比赛总结: 只做出了A, B , C 剩下的也是可以补的题, 今天要补补了........

     

  • 相关阅读:
    .NET面试题系列[2]
    .NET面试题系列[1]
    被淡忘的c#析构函数
    关于Spring IOC容器解释
    工作随笔记 点击除div自身之外的地方,关闭自己
    js获得控件位置
    PHP如何判断对象为空的方法分享
    PHP 网页调用本地exe程序实例
    PHP jQuery实现上传图片时预览图片的功能实例
    Yii 自带的分页实例
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7358681.html
Copyright © 2011-2022 走看看