Restoring Numbers

来源:互联网 发布:暴风影音官网windows版 编辑:程序博客网 时间:2024/05/17 23:27

属于构造反证

先设A[I] = 0 , 那么我们就可以出b[i], 并且0 <= b[i] < k, 然后再根据w[i][1] = a[i] + b[1] -> a[i] = w[i][1] - b[1]  并且 -k < a[i] < k ; 

所以    -k< a[i] + b[i] < 2*k  假设这个结果正确的话, 那么  w[i][j] - a[i] - b[j] 的绝对值 等于k 或者 零, 

如果所有的 w[i][j] - a[i] - b[j]都等于零, 那么k 就是一个无穷大就好了, 

如果 w[i][j] - a[i] - b[j] != 0  那么这个结果只可能是K, 

然后再反过来验证下 w[i][j] 是不是都小于K就好了

#include <iostream>

#include <stdlib.h>
#include <stdio.h>
#include <string.h>


using namespace std;
#define LL long long
#define INF 1e18
LL w[111][111];
LL tem[111][111];
LL a[111];
LL b[111];
int main()
{
    LL n,m,k;
    scanf("%lld %lld",&n, &m);
    for( LL i = 1; i <= n; i++)
     for( LL j = 1; j <= m; j++)
      scanf("%lld",&w[i][j]);
    a[1] = 0;
    for( LL i = 1; i <= m; i++)
     b[i] = w[1][i];
    for( LL i = 2; i <= n; i++)
     a[i] = w[i][1] - b[1];
    bool flag = false;
    bool ok = false;
    for( int i = 1; i <= n; i++)
    {
        for( int j = 1; j <= m; j++)
        {
            if(a[i] + b[j] < 0)
              tem[i][j] = w[i][j] - a[i]- b[j];
            else
              tem[i][j] = a[i] + b[j] - w[i][j];
            if(tem[i][j])
            flag = true;
        }
    }
    if(!flag)
     k = (LL)INF, ok = true;
    else
    {
        k = 0, ok = true;
        for( int i = 1; i <= n; i++)
        {
            for( int j = 1; j <= m; j++)
            {
                if(tem[i][j])
                {
                    if(k && k != tem[i][j])
                    {
                        ok = false;
                        break;
                    }
                    k = tem[i][j];
                }
            }
        }
    }


    for( LL i = 1; i <= n; i++)
     for( LL j = 1; j <= m; j++)
     {
         if(w[i][j] >= k)
           ok = false;
     }
     if(!ok)
      printf("NO\n");
    else
    {
        printf("YES\n");
        printf("%lld\n",k);
        for( int i = 1; i < n; i++)
         printf("%lld ",a[i] < 0? a[i] + k: a[i]);
        printf("%lld\n",a[n] < 0? a[n] + k: a[n]);
        for( int i = 1; i < m; i++)
         printf("%lld ",b[i]);
        printf("%lld\n",b[m]);
    }


}
0 0
原创粉丝点击