码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-04 19:10:09      阅读:194      评论:0      收藏:0      [点我收藏+]

标签:clu   int   方法   引号   problem   不能   ret   inline   条件   

小帆宝与数字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 分类讨论

标签:clu   int   方法   引号   problem   不能   ret   inline   条件   

原文地址:http://www.cnblogs.com/scidylanpno/p/7978056.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!