ZZNU 2076(退役学长最后的神功 zz题)

题目链接:http://acm.zznu.edu.cn/problem.php?pid=2076

 

输入一个T表示有T个样例
每组实例一个整数n(0〈n〈1000
接下来输入2*n个数字,代表一个2*n的矩阵(每个数大于0小于1000)

这些数可以任意调换位置,如果任意一个数与相邻一个数相加和不是三的倍数,则输出YES,反之输出NO。

占一行。

样例输入

2

10

6 6 6 6 6 1 1 1 1 1
8 8 8 8 8 8 8 8 8 8
4
3 6 9 1
1 2 1 7

样例输出

YES
YES

 

Preview

emmm,本来这场比赛有一道矩阵快速幂的fib,结果写到一半被学长改掉了,这题题目恰巧又说矩阵,导致以为换题了全程死扣矩阵解法,毫无悬念地GG.

解题思路:

因为数字能任意换位置,所以矩阵的格式原则上没有太大作用.

将输入所有数字对3取余,统计0的个数a.

原则上3的倍数最完美会出现如下情况:

    0 X 0 X 0

       X 0 X 0 X

这种交错情况下就能无视其他非3倍数了,因为我们只需要将a与 n 进行比较.

显然易见,当 a>n时候,必定会出现0 与 0镶嵌的情况,因此 必定输出  NO.

 

此题关键在于a<=n 时候会有  a<=1 和 a==2 的特殊情况.

当a<=1时。出现如下情况:

      ?XX

      XXX

显然,无论 ? 是否为0,X只能全为2或者全为1.

 

当a==2时,原则上必定要如下情况:

      X0XX

      XX0X

同上情况,X全为1或全为2必定符合,再仔细看,其实0 0 这斜着的一竖 两边分别全为1 2其实也符合.

 

 

AC代码:

//E

#include <cstdio>
#include <cstring>
using namespace std;


int main()
{
    int t,x,n;
    scanf("%d",&t);
    while(t--)
    {
        int a=0,b=0,c=0;
        scanf("%d",&n);
        //memset(a,0,sizeof(a));

        for(int i=1; i<=n*2; i++)
        {
                scanf("%d",&x);
                x%=3;
                if(x==0) a++;
                else if (x==1) b++;
                else c++;

        }
        bool flag=true;
        if(a>n) flag=false;
        else
        {
            if(a<=1)
            {
                if(b==0||c==0) flag=true;
                else flag=false;
            }
            else if(a==2)
            {
                if(c%2==1&&b%2==1) flag=true;
                else if(b==0||c==0) flag=true;
                else flag=false;
            }

        }

        if(flag)  puts("YES");
        else puts("NO");
    }
    return 0;
}

 

posted on 2017-12-02 19:06  欲儿很轻狂  阅读(624)  评论(0编辑  收藏  举报

导航