• 2017acm南宁现场赛 J题 Rearrangement


    题意:

    给定一个2 * n的矩阵, 和 2 * n 个数, 问能不能通过重排列, 使得任意相邻两数不能被3整除

    分析:

    这题一直卡到最后, 赛后经对面大佬提醒后, 发现统计所有数模三的结果(0,1,2三种), 然后考虑怎么去“构造”符合这样的矩阵就行。

    本地只过了用例和一些小数据, 等一个重现赛。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn = 10000 + 7;
     4 int n;
     5 int num[maxn*2];
     6 int _0,_1,_2;
     7 bool judge()
     8 {
     9      if(_0 > n)//_0会有相邻
    10         return false;
    11 
    12      if(_1 == 0 || _2 == 0) // 只有1, 2其中一种, 不用分割
    13         return true;
    14 
    15      if(_0 <= 1)//有1, 2两种而且不形成分割
    16         return false;
    17 
    18      if(_0 == n)
    19         return true;
    20      if(_0 % 2 == 0)
    21     /* _0偶数情况, 形成|* 2 2 2|
    22                       |1 * 2 2|可以隔出奇数个位置   */
    23      {
    24         if(_1 % 2 == 0 || _2 % 2 == 0)//偶数个位置不能被隔开
    25             return false;
    26 
    27         return true;
    28      }
    29      else
    30      /* _0奇数情况, 形成|* & * 2|
    31                        |1 * 2 2|至少有(_0 - 2)个围住位置(&)可以任选, 所以奇偶都行*/
    32      {
    33 
    34         return true;
    35      }
    36 }
    37 int main()
    38 {
    39 //    freopen("data.txt","r", stdin);
    40     int T;
    41     scanf("%d", &T);
    42     while(T--)
    43     {
    44         scanf("%d", &n);
    45         _0 = _1 = _2 = 0;
    46         for(int i = 0; i < 2*n; i++)
    47         {
    48             scanf("%d", &num[i]);
    49             if(num[i] % 3 == 0) _0++;
    50             else if(num[i] % 3 == 1) _1++;
    51             else _2++;
    52         }
    53 //        printf("%d %d %d
    ", _0, _1, _2);
    54         printf("%s
    ", judge()? "YES":"NO");
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    读取手机硬件信息
    Android存储空间不足的解决办法
    Android实现系统重新启动
    使用PackageManager获得应用(包)信息
    获得屏幕尺寸
    Android获取ROOT权限
    Android调用系统自带的设置界面
    TabHost的使用
    ListActivity的使用
    Ubuntu密码错误的问题
  • 原文地址:https://www.cnblogs.com/Jadon97/p/7901128.html
Copyright © 2020-2023  润新知