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 分类讨论的主要内容,如果未能解决你的问题,请参考以下文章
十年磨一剑,水产宝与升鲜宝即将横空出世,将正面与市面上的商业软件竞争。用小米加步枪对洋枪洋炮。升鲜宝将为杭州生鲜配送企业服务,8年的生鲜电商行业沉淀。