zoukankan      html  css  js  c++  java
  • CF1472B Fair Division

    本题解与Luogu同步

    Solution

    这道题,我们可以很直接地想到:遇到遇到两个相同的就一人分一个,如果最后还剩下一个(1g)或者一个(2g),说明不能平分,直接输出NO

    很简单,可以直接用!实现。

    但是!但是!但是!

    我们自信满满地交上去,发现……

    Wrong Anwser On Pretest 2

    顿时心就……没了

    我们可以造一组(hack)数据:

    1
    3
    2 1 1
    

    很明显这个是可以平分的(一个分俩(1g),一个分一个(2g)

    但是,我们这样的程序会输出NO

    这是为什么呢?

    我们发现,两个(1g)是可以拼成一个(2g),而这个算法并没有意识到这一点……所以……

    然而

    只要思想不滑坡,办法总比困难多

    我们可以分别记(1g,2g)的数量,最后,我们可以推导出如下规律:

    Ⅰ. 当(2g)的数量(mod2=0)

    (1g)的数量(mod2=0),成立,否则,不成立

    WHY?

    这里我们可以把(2g)糖抽象成正方形,(1g)糖抽象成正方形一半。两个人的糖数分别为两列,当两列高度一致时,成立。

    很明显,我们可以把(2g)先分配完,由于(2g)是偶数,所以应该正好分配相等。

    很明显(1g)是偶数,就成立啦

    Ⅱ. 当(2g)的数量(mod2=1)

    (1g)的数量(mod2=0),成立,否则,不成立

    不过这里要特判(0)

    Code

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    int t, n;
    
    int main()
    {
        scanf("%d", &t);
        while(t--)
        {
            scanf("%d", &n);
            int a, a1 = 0, a2 = 0;
            for(int i = 1; i <= n; i++)
            {
                scanf("%d", &a);
                if(a == 1)
                    a1++;
                else
                    a2++;
            }
            if(a2 % 2 == 0)
            {
                if(a1 % 2 == 0) printf("YES
    ");
                else printf("NO
    ");
            }
            else
            {
                if(a1 == 0) printf("NO
    ");
                else if(a1 % 2 == 0) printf("YES
    ");
                else printf("NO
    ");
            }
        }
        return 0;
    }
    
  • 相关阅读:
    数据类面试题
    java二进制文件复制
    String源码
    集合类题目
    OBJ-C
    java文件(文件夹)操作
    java中输入方式Scanner和BufferedReader
    二次分发举例
    Eclipse常用快捷键
    c#获取新浪微博登录cookie
  • 原文地址:https://www.cnblogs.com/w-rb/p/14254579.html
Copyright © 2011-2022 走看看