首页 > 试题广场 >

重排数列

[编程题]重排数列
  • 热度指数:112 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 98M,其他语言196M
  • 算法知识视频讲解
小易有一个长度为N的正整数数列A = {A[1], A[2], A[3]..., A[N]}。
牛博士给小易出了一个难题:
对数列A进行重新排列,使数列A满足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍数。
小易现在需要判断一个数列是否可以重排之后满足牛博士的要求。

输入描述:
输入的第一行为数列的个数t(1 ≤ t ≤ 10),
接下来每两行描述一个数列A,第一行为数列长度n(1 ≤ n ≤ 10^5)
第二行为n个正整数A[i](1 ≤ A[i] ≤ 10^9)


输出描述:
对于每个数列输出一行表示是否可以满足牛博士要求,如果可以输出Yes,否则输出No。
示例1

输入

2
3
1 10 100
4
1 2 3 4

输出

Yes
No
/*
复杂度为O(n)
统计三种数字:
1.能被4整除,取名div4,(可以认为在此题中这种数字比较珍贵)
2.只能被2整除,但不能被4整除d,iv2
3.不能被2整除,div1
a.如果不存在只能被2整除的数字,那么按照div1和div4相间排列即可满足要求,且div1可以占据首尾,即div1 <= div4 + 1;
b.如果存在div2,将它们放在最后面,1 4 1 4 2 2 2排列
c.其他情况,No
*/
#include<bits/stdc++.h>
using namespace std;

bool judge(vector<int>& vec)
{
    int div1 = 0, div2 = 0, div4 = 0;//,,不能被2整除的数字个数div1
    for(auto &c : vec)
    {
        if(c % 2 == 0)
        {
            if(c % 4 == 0)
                div4++;//能被4整除的数字个数div4
            else
                div2++;//统计只能被2整除的数字个数div2
        }
        else
            div1++;//不能被2整除的数字个数div1
    }
    if(div2 == 0)//如果不存在只能被2整除的数字
    {
        if(div1 - 1 <= div4)//1 4 1 4 1 4 1符合要求
            return true;
    }
    else//存在只能被2整除的数字
    {
        if(div1 <= div4)//1 4 1 4 1 4 2 2 2符合要求
            return true;
    }
    return false;
}

int main()
{
    int n;
    while(cin >> n)
    {
        for(int i = 0; i < n; i++)
        {
            int m;
            cin >> m;
            vector<int> vec;
            int temp;
            for(int j = 0; j < m; j++)
            {
                cin >> temp;
                vec.push_back(temp);
            }
            if(judge(vec))
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
    }
    return 0;
}

发表于 2018-08-10 23:08:54 回复(0)
寻找满足条件下的规律:
    首先寻找整除4的数可以先统计,然后统计不能4整除单能整除2的数,最后统计两者都不能的,我们知道连续的能整除2的数的两个数的乘积是可以整除4的,然后判断能整除4的个数和不能被乘除的个数,就可以得出:
#include<iostream>
#include<vector>
usingnamespacestd;
intmain()
{
    intt;
    cin>>t;
    vector<string> re;
    for(inti=0;i<t;++i){
        intn;
        cin>>n;
        intcount_4=0,count_2=0,count_1=0;
        for(inti=0;i<n;++i){
            intm;
            cin>>m;
            if(m%4==0)
                ++count_4;
            else if(m%2==0)
                ++count_2;
            else
                ++count_1;
        }
        count_2=count_2%2;
        if(count_4>=count_2+count_1-1)
            re.push_back("Yes");
        else
            re.push_back("No");
    }
    for(auto s:re)
        cout<<s<<endl;
}
发表于 2018-05-28 11:26:55 回复(0)