zoukankan      html  css  js  c++  java
  • cf c题 个人赛 思维

    给你一个矩阵,一开始都是零,让你通过只能刷一行或者一列的方式,把开始的矩阵刷乘给你的矩阵:

    考虑最优解:

    例如:

    3 4                 4 3

    1 1 1 1          1 1 1

    1 1 1 1          1 1 1

    1 1 1 1          1 1 1

                         1 1 1

    #include <iostream>
    #include<string.h>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int main()
    {
        int m,n,ge,a[110][110],t=0,t1=0,row[110000],b[110][110],col[110000],i,j,minn;
        scanf("%d%d",&n,&m);
        for(i=0; i<=n-1; i++)
            for(j=0; j<=m-1; j++)
            {
                scanf("%d",&a[i][j]);
            }
        if(n<=m)
        {
            for(i=0; i<=n-1; i++)
            {
                ge=0;
                minn=0x3f3f3f3f;
                for(j=0; j<=m-1; j++)
                {
                    if(a[i][j]>=1)
                        ge++;
                    minn=min(minn,a[i][j]);
                }
                if(ge==m)
                {
                    for(int k=1; k<=minn; k++)
                        row[t++]=i+1;
                    for(j=0; j<=m-1; j++)
                        b[i][j]+=minn;
                }
    
            }
            /* for(i=0;i<=n-1;i++)
                 for(j=0;j<=m-1;j++)
             {
                 if(j==m-1)
                     printf("%d
    ",b[i][j]);
                 else
                     printf("%d ",b[i][j]);
             }*/
            for(j=0; j<=m-1; j++)
            {
                ge=0;
                minn=0x3f3f3f3f;
                int p=a[0][j]-b[0][j];
                for(i=0; i<=n-1; i++)
                {
                    if(a[i][j]-b[i][j]==p)
                        ge++;
                }
                if(ge!=n&&ge!=0)
                {
                    printf("-1
    ");
                    return 0;
                }
                else
                {
                    for(int k=1; k<=p; k++)
                        col[t1++]=j+1;
                    for(i=0; i<=n-1; i++)
                        b[i][j]+=p;
                }
            }
            int flag=0;
            for(i=0; i<=n-1; i++)
            {
                for(j=0; j<=m-1; j++)
                {
                    if(a[i][j]!=b[i][j])
                    {
                        flag=1;
                    }
                }
            }
            if(flag==1)
                printf("-1
    ");
            else
            {
                printf("%d
    ",t1+t);
                for(i=0; i<=t-1; i++)
                    printf("row %d
    ",row[i]);
                for(i=0; i<=t1-1; i++)
                    printf("col %d
    ",col[i]);
            }
        }
        else
        {
            for(j=0; j<=m-1; j++)
            {
                ge=0;
                minn=0x3f3f3f3f;
                for(i=0; i<=n-1; i++)
                {
                    if(a[i][j]>=1)
                        ge++;
                    minn=min(minn,a[i][j]);
                }
                if(ge==n)
                {
                    for(int k=1; k<=minn; k++)
                        col[t1++]=j+1;
                    for(i=0; i<=n-1; i++)
                        b[i][j]+=minn;
                }
    
            }
            /* for(i=0;i<=n-1;i++)
                 for(j=0;j<=m-1;j++)
             {
                 if(j==m-1)
                     printf("%d
    ",b[i][j]);
                 else
                     printf("%d ",b[i][j]);
             }*/
            for(i=0; i<=n-1; i++)
            {
                ge=0;
                minn=0x3f3f3f3f;
                int p=a[i][0]-b[i][0];
                for(j=0; j<=m-1; j++)
                {
                    if(a[i][j]-b[i][j]==p)
                        ge++;
                }
                if(ge!=m&&ge!=0)
                {
                    printf("-1
    ");
                    return 0;
                }
                else
                {
                    for(int k=1; k<=p; k++)
                        row[t++]=i+1;
                    for(j=0; j<=m-1; j++)
                        b[i][j]+=p;
                }
            }
            int flag=0;
            for(i=0; i<=n-1; i++)
            {
                for(j=0; j<=m-1; j++)
                {
                    if(a[i][j]!=b[i][j])
                    {
                        flag=1;
                    }
                }
            }
            if(flag==1)
                printf("-1
    ");
            else
            {
                printf("%d
    ",t1+t);
                for(i=0; i<=t1-1; i++)
                    printf("col %d
    ",col[i]);
                for(i=0; i<=t-1; i++)
                    printf("row %d
    ",row[i]);
    
            }
    
    
        }
    
    
    
    }
  • 相关阅读:
    Git的初步学习
    Git的初步学习
    微信小程序我的界面
    微信小程序我的界面
    Day2:html和css
    Day2:html和css
    Day1:html和css
    Day1:html和css
    Java之JDK7的新语法探索
    Java之JDK7的新语法探索
  • 原文地址:https://www.cnblogs.com/bhd123/p/9742616.html
Copyright © 2011-2022 走看看