CDOJ 1804 小帆宝与数字8 分类讨论

小帆宝与数字8

题目链接:http://acm.uestc.edu.cn/#/problem/show/1804

Description

小帆宝8岁时换了个可爱的小同桌,小同桌非常喜欢8这个数字。一天上课学习完乘法后,小同桌给了帆宝一堆数,问帆宝能不能把它们排成一排,让所有相邻两个数的乘积都为8的倍数呢?
帆宝当然拒绝不了可爱小同桌的要求啦,但是又怕答错呢。机智的你能帮帮他吗?

Input

第一行一个数,表示数字个数\(N(N≤100)\)
第二行有\(N\)个数,分别是小同桌给帆宝的第\(i\)个数\(a_i(a_i\in(1,2,4,8))\)

Output

如果能找到满足条件的排列方法,输出”YES”并在第二行输出任意一种方案,如果不能,则输出”NO”。(无双引号,注意大小写)

Sample Input and Output

Sample InputSample Output
4 <br > 8 1 1 8YES <br > 1 8 8 1
3 <br > 1 2 4NO

Hint


题意

给定N个数,均为1 2 4 8,问是否存在一种排列使得相邻两个数的乘积为8的倍数

题解

首先
1的旁边肯定得是8
2的旁边可以是4和8
4的旁边可以是2 4 8 (不可以是1)
8的旁边爱谁谁

等等
数据范围这么小
那就暴力吧:
从头奇数位放完1放2,从头偶数位放完8放4
压缩一下=-=判断是否合法
如果不合法,显然就没有更合理的方法了=-=

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e3;
int ma[MAXN];
int T[MAXN];
int cnt[10];

int main()
{
    int N;
    cin>>N;
    int x;
    int i=0;
    for(i=0;i<N;++i)
    {
        cin>>x;
        cnt[x]++;
    }
    i=0;
    while(cnt[1])
    {
        ma[i]=1;
        i+=2;
        cnt[1]--;
    }
    while(cnt[2])
    {
        ma[i]=2;
        i+=2;
        cnt[2]--;
    }
    i=1;
    while(cnt[8])
    {
        ma[i]=8;
        i+=2;
        cnt[8]--;
    }
    while(cnt[4])
    {
        ma[i]=4;
        i+=2;
        cnt[4]--;
    }
    int cc=0;i=0;
    while(i<N)
    {
        while(ma[cc]==0)    cc++;
        T[i++]=ma[cc++];
    }
    for(int i=0;i<N-1;++i)
    {
        if(T[i]*T[i+1]<8)
        {
            cout<<"NO"<<endl;
            return 0;
        }
    }
    cout<<"YES"<<endl;
    for(int i=0;i<N;++i)    cout<<T[i]<<" ";
    return 0;
}

版权所有:scidylanpno
原文链接:http://www.cnblogs.com/scidylanpno/p/7978056.html

转载于:https://www.cnblogs.com/scidylanpno/p/7978056.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值