• Codeforces Round #221 (Div. 2)


    A. Lever

    题意:给出下面这种字符串,^是杠杆的支点,问杠杆是否平衡。

        9===^==1

    分析:直接做。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    char s[1000005];
    int main(){
         long long i, j, k;
        long long l, r;
        while (scanf("%s",s)!=EOF){
            long long g = 0;
            l = r = 0;
            for (i=0; s[i]; i++){
                if (s[i] == '^')
                    break;
            }
            g = i;
            for (i=g-1; i>=0; i--){
                if (s[i]=='=')continue;
                l += (g-i)*(long long)(s[i]-'0');
            }
            for (i=g+1; s[i]; i++){
                if (s[i]=='=')continue;
                r += (i-g)*(long long)(s[i]-'0');
            }
            if (l > r)printf("left
    ");
            else if (r > l)printf("right
    ");
            else printf("balance
    ");
        }   
        return 0;
    }
    A.cpp

    B. I.O.U.

    题意:给出每个关系,a, b, c表示a欠b c元,问通过调整,最后总的欠债数的和最少是多少,

           例如:

           1 2 20

           2 3 20

           总的欠债额是40,调整之后,1欠3 20元,2谁都不欠。

    分析:假设每个人被欠的钱都被还了,那么他再拿这个钱去还他欠的钱即可。

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 102;
    
    int g[maxn][maxn];
    int ma[maxn];
    int n, m;
    
    int main(){
        while (scanf("%d %d",&n,&m)!=EOF){
            memset(g, 0, sizeof(g));
            memset(ma, 0, sizeof(ma));
            int a, b, c;
            while (m--){
                scanf("%d %d %d",&a,&b,&c);
                g[a][b] = c;
                ma[b] += c; 
            }   
            for (int i=1; i<=n; i++){
                for (int j=1; j<=n; j++){
                    if (g[i][j]){
                        if (ma[i] >= g[i][j]){
                            ma[i] -= g[i][j];
                        }
                        else{
                            ma[i] = 0;
                            break;
                        }
                    }
                }   
            }
            int res = 0;
            for (int i=1; i<=n; i++){
                res += ma[i];
            }
            printf("%d
    ",res);
        }   
        return 0;
    }
    B.cpp

    C. Divisible by Seven

    题意:一个长度大于3的字符串,里面一定含有1,6,8,9,把这个字符串调整一下使得最后的数可以被7整除。

    分析:构造。可以把1,6,8,9放到字符串最前面,它的全排列对7的余数覆盖了1,2,3,4,5,6,只要枚举一下全排列即可。

    /****************************************
    * File Name: 221c.cpp
    * Author: sky0917
    * Created Time: 2013年12月25日  7:24:58
    ****************************************/
    #include <map>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 1000005;
    
    int p[4] = {1, 6, 8, 9};
    int n;
    char s[maxn];
    int main(){
    
        int i, j, k;
        while (scanf("%s",s)!=EOF){
            n = strlen(s);
            for (j=0; j<4; j++){
                for (i=0; i<n; i++){
                    if (s[i] == p[j]+'0'){
                        swap(s[i], s[n-j-1]);
                    }
                }
            }
            s[n-4] = '';  
            j = 0;
            k = 1;
            for (i=0; i<n-4; i++){
                j = (j*10 + s[i]-'0') % 7;
                k = (k*10) % 7;
            }   
            j = (7-j) % 7;
            bool flag = false;
            while (1){
                int val = 0;
                for (i=0; i<4; i++){
                    val = (val * 10 + p[i]) % 7;
                }
                val = (val * k) % 7;
                if (val == j){
                    for (i=0; i<4; i++)
                        printf("%d",p[i]);  
                    printf("%s
    ",s);
                    flag = true;
                    break;
                }
                if (!next_permutation(p, p+4))
                    break;
            }
            if (!flag)printf("0
    ");
        }   
        return 0;
    }
    C.cpp

    D. Maximum Submatrix 2

    题意:一个n*m的grid,里面的数字只有1,0,你可以任意调换两行的顺序,问调换之后的方格阵中满足所有元素都是1的矩阵的面积最大是多少。

    分析:枚举子矩阵的列的起点,然后计算出g[i][j],他表示从(i,j)向右连续的1的个数,用f[j]保存,对其从大到小排序,然后枚举f[j]*row,找出最大值,时间复杂度m*n*log(n) --!

    /****************************************
    * File Name: 221d.cpp
    * Author: sky0917
    * Created Time: 2013年12月25日  6:59:33
    ****************************************/
    #include <map>
    #include <cmath>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 5002;
    
    char a[maxn][maxn];
    int la[maxn][maxn];
    int f[maxn];
    int n, m;
    void solve(){
        for (int i=1; i<=n; i++){
            la[i][0] = 0;
            for (int j=1; j<=m; j++){
                if (a[i][j] == '1'){
                    la[i][j] = la[i][j-1] + 1;
                }
                else la[i][j] = 0;
            }
        }   
        int res = 0;
        for (int j=1; j<=m; j++){
            for (int i=1; i<=n; i++){
                f[i] = la[i][j];
            }   
            sort(f+1, f+n+1);
            for (int i = n; i>0; i--){
                res = max(res, (n-i+1)*f[i]);
            }
        }
        printf("%d
    ",res);
    }
    int main(){
        while (scanf("%d %d",&n,&m)!=EOF){
            for (int i=1; i<=n; i++){
                scanf("%s",a[i]+1);
            }
            solve();
        }   
        return 0;
    }
    D.cpp
  • 相关阅读:
    软考收获
    寻找她(指令寻址)——(软考六)
    算法探究——(软考四)
    Shell排序——软考(五)
    Java String类源码
    Java 抽象类详解
    Spring IOC Container
    Tomcat的架构
    Spring与Web框架(例如Spring MVC)漫谈——关于Spring对于多个Web框架的支持
    HTML form表单中action的正确写法
  • 原文地址:https://www.cnblogs.com/sky0917/p/3490757.html
Copyright © 2020-2023  润新知