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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 Input Sample Output
4
8 1 1 8
YES
1 8 8 1
3
1 2 4
NO

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

以上是关于CDOJ 1804 小帆宝与数字8 分类讨论的主要内容,如果未能解决你的问题,请参考以下文章

贝宝与 ActiveMerchant

贝宝与 ActiveMerchant

cdoj 851 方老师与素数 bfs

自适应支付贝宝与标准贝宝账户合作

CDOJ 1811 洗牌机 数论

十年磨一剑,水产宝与升鲜宝即将横空出世,将正面与市面上的商业软件竞争。用小米加步枪对洋枪洋炮。升鲜宝将为杭州生鲜配送企业服务,8年的生鲜电商行业沉淀。