首页 > 试题广场 >

重排数列

[编程题]重排数列
  • 热度指数:80 时间限制: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
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char IsTwFo(int a)
{
    char flag;
    if (!(a % 4))
        flag = 2;
    else if (!(a % 2))
        flag = 1;
    else
        flag = 0;
    return flag;
}
char IsYes(int num_1, int num_0, int a)//满足条件flag=1
{                                       //num_1-能被4整除,num_0--能被2整除
    char flag;
    if ((a == num_0) || (num_1 >= a - num_0 - num_1))
        flag = 1;
    else
        flag = 0;
    return flag;
}
int main()
{
    int N;
    while (scanf("%d", &N) != EOF)
    {
        int n[10] = { 0 };
        int i, j;
        int **A = (int **)(malloc(N*sizeof(int *)));

        for (i = 0; i < N; i++)
        {
            scanf("%d", &n[i]);
            A[i] = (int *)(malloc(n[i] * sizeof(int)));
            for (j = 0; j < n[i]; j++)
            {
                scanf("%d", &A[i][j]);
            }
        }

        int num[10][2] = { 0 };//统计每个数列只能被2和能被4整除的数量
                               //num[i][0]--能被4整除,num[i][1]--能被2整除

        for (i = 0; i < N; i++)
        {
            for (j = 0; j < n[i]; j++)
            {
                if (IsTwFo(A[i][j]) == 2)
                    num[i][0]++;
                else if (IsTwFo(A[i][j]) == 1)
                    num[i][1]++;
            }
        }
        for (i = 0; i < N; i++)
        {
            if (IsYes(num[i][0], num[i][1], n[i]))
                printf("Yes\n");
            else
                printf("No\n");
        }
        for (i = 0; i < N; i++)
        {
            free(A[i]);
        }
        free(A);

    }  
  //  system("pause");
    return 0;
}
发表于 2018-08-06 19:52:56 回复(0)

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int n;
    int num;
    cin>>num;
    while(num--)
    {
        cin>>n;
        int n4=0,n2=0,n1=0;
        while(n--)
        {
            int temp=0;
            cin>>temp;
            if(temp%4==0)
                n4++;
            else if(temp%2==0)
                n2++;
            else
                n1++;
        }
        if(n2==0)
        {
            if(n4>=n1-1)
            {
                printf("Yes\n");
            }
            else
            {
                printf("No\n");
            }
        }
        else
        {
            if(n4>=n1)
            {
                printf("Yes\n");
            }
            else
            {
                printf("No\n");
            }
        }
    }
    return 0;
}


发表于 2018-07-31 22:26:22 回复(0)