ホームページ >ウェブフロントエンド >htmlチュートリアル >CF#277 (ディビジョン 2) B.(前処理)_html/css_WEB-ITnose

CF#277 (ディビジョン 2) B.(前処理)_html/css_WEB-ITnose

WBOY
WBOYオリジナル
2016-06-24 11:54:151073ブラウズ

マトリックスの B. OR

テストごとの制限時間

1 秒

テストごとのメモリ制限

256 メガバイト

入力

標準入力

出力

標準出力

题目链接: http:/ /codeforces.com/contest/486/problem/B

論理 OR を、2 つの論理値 (つまり、集合 {0,?1} に属する値) に対する演算として定義しましょう。または、どちらかの場合は 1 に等しくなります。両方の論理値は 1 に設定され、それ以外の場合は 0 になります。同じ方法で 3 つ以上の論理値の論理 OR を定義できます:

where は、ある ai?=?1 の場合は 1 に等しく、そうでない場合は等しい

Nam には、m 行と n 列で構成される行列 A があります。行には 1 から m までの番号が付けられ、列には 1 から n までの番号が付けられます。行 i (1?≤?i?≤?m)、列 j (1?≤?j?≤?n) の要素は Aij と表されます。 A のすべての要素は 0 または 1 です。Nam は行列 A から、次の式を使用して同じサイズの別の行列 B を作成します:

.

(Bij は行列 A の行 i と列 j のすべての要素の OR です)

Nam は行列 B を与え、行列 A を推測するように要求します。Nam は賢いですが、A のサイズが大きくなる可能性があるため、おそらく行列 B の計算中に間違いを犯す可能性があります。

入力

最初の行には 2 つの整数が含まれていますm と n (1?≤?m,?n?≤?100)、それぞれ行列の行数と列数です

次の m 行にはそれぞれ、行列 B の行を表すスペースで区切られた n 個の整数が含まれています (各要素B の値は 0 または 1)。

出力

最初の行で、Nam が B の計算を間違えた場合は「NO」を出力し、それ以外の場合は「YES」を出力します。最初の行が「YES」の場合、指定された行列 B を生成できる行列 A を表す n 個の整数で構成される mrows も出力します。複数の解がある場合は、いずれかを出力します。

サンプル テスト

入力

2 21 00 0

出力

NO

入力

2 31 1 11 1 1

出力

YES1 1 11 1 1

入力

2 30 1 01 1 1

出力

YES0 0 00 1 0
解题思路:
	题目大意就是给你m和n,接下来输入m*n的B矩阵,问是否存在一个m*n的A矩阵,使得对于Bij这个元素来说,它是由A矩阵的第i行所有元素和第j列所有元素“或运算”得来。存在的话输出YES,并输出任意一组符合条件的A矩阵,否则输出NO。
	我的方法还是偏暴力,首先开一个二维数组存A矩阵,并对其初始化元素全为1。首先这样考虑,如果Bij对应的值为0,那么A矩阵的第i行和第j列一定全部为0,出现一个1都不行,因为“或运算”全0出0。这样更新一遍后,A矩阵的0的位置就能全部确定了。接下来最暴力的部分O(n*m*max(n,m))的判断A矩阵每个位置的元素是否满足B矩阵中0或1的条件。最后flag没变的话,说明存在这样的A矩阵,同时A矩阵也被我们更新好了,输出即可;反之,不存在输出NO。
完整代码:
<pre name="code" class="n">#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <climits>#include <cassert>#include <complex>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;typedef double DB;typedef unsigned uint;typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const DB EPS = 1e-9;const DB OO = 1e20;const DB PI = acos(-1.0); //M_PI;int n , m;int g[1111][1111];int res[1111][1111];bool check_0(int x , int y){    for(int i = 0 ; i < m ; i ++)    {        if(res[x][i] == 1)            return false;    }    for(int i = 0 ; i < n ; i ++)    {        if(res[i][y] == 1)            return false;    }    return true;}bool check_1(int x , int y){    for(int i = 0 ; i < m ; i ++)    {        if(res[x][i] == 1)            return true;    }    for(int i = 0 ; i < n ; i ++)    {        if(res[i][y] == 1)            return true;    }    return false;}int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    while(~scanf("%d%d",&m,&n))    {        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                scanf("%d",&g[i][j]);            }        }        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                res[i][j] = 1;            }        }        //int flag = 0 ;        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                if(g[i][j] == 0)                {                    for(int k = 0 ; k < n ; k ++)                        res[i][k] = 0;                    for(int k = 0 ; k < m ; k ++)                        res[k][j] = 0;                }            }        }        int flag1 = 0;        for(int i = 0 ; i < m ; i ++)        {            for(int j = 0 ; j < n ; j ++)            {                if(g[i][j] == 0)                {                    if(!check_0(i , j))                        flag1 = 1;                }                else if(g[i][j] == 1)                {                    if(!check_1(i , j))                        flag1 = 1;                }                if(flag1)                    break;            }            if(flag1)                break;        }        if(flag1)            printf("NO\n");        else        {            printf("YES\n");            for(int i = 0  ; i < m  ; i ++)            {                for(int j = 0 ; j < n ; j ++)                {                    printf("%d%c",res[i][j], j == n - 1 ? '\n' : ' ');                }            }        }    }}


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。