解题思路:题目:n个数,最多三个一组,要求拼成6数量的结果最优;
首先我们先接收数据,建立一个数组how[7],函数Count6用来求6的个数,有6(6以上算6),5,4,3,2,1,0(没用),how[1]对应1个6的个数...;
核心思路是尽量用少的6从大往小凑好每一组;
接下来处理数,我们的思路是从5到2开始处理,每个数处理时思路尽量先用最少的6来组成6;
6单独一组放res里
5和任何数(1,2,3,4,5)都能成6,从1开始往里循环消耗
4和2,3,4都能直接成6,特别地要先判断411三数组合,再从2开始往里消耗
//3和3直接成6,要特别地先判断321和322
//2要判断222
在3和2的判断里我简单优化了一下,在只剩数组how3,2,1的时候,只有321用的到1,之后就可以用剩下的(3,2)/6随便拼;
注意事项:
情况要考虑全,我感觉这方法比较普通好想一些,写完要赶快带几种情况试试;
像处理两个5的时候if语句里的判断和{里的内容要改
像只有1个5的时候要及时结束循环
只有3和2可以/6随便拼,往大了会出现555,1个6,却除成了2个6,往小了1用不了
有简化手法或者思路,希望教教我,感谢
参考代码:
#include<bits/stdc++.h>
using namespace std;
int how[7];
int Count6(int n)
{
int res=0;
while(n!=0)
{
if(n%10==6) res++;
n/=10;
}
if(res>=6) return 6;
return res;
}
int main()
{
int n;
cin>>n;
for(int a,i=0;i<n;i++)
{
cin>>a;
how[Count6(a)]++;
}
int res=how[6];
int m=1;
while(how[5])
{
if(m==5&&how[5]>1) {res++;how[5]-=2;}
else
if(m==5) break;
else
if(how[m]>0) { res++;how[5]--;how[m]--;}
else m++;
}
m=1;
while(how[4])
{
if(m==4&&how[4]>1) {res++;how[4]-=2;}
else
if(m==4) break;
else
if(how[1]>1) { res++;how[4]--;how[1]-=1;}
else
if(how[m]>0) {res++;how[4]--;how[m]--;}
else m++;
}
// while(how[3])
// {
// if(how[3]>1) {res++;how[3]-=2;}
// else if(how[2]>0&&how[1]>0) {res++;how[3]--;how[2]--;how[1]--;}
// else if(how[2]>1) {res++;how[3]--;how[2]-=2;}
// else break;
// }
// while(how[2])
// {
// if(how[2]>2) {res++;how[2]-=3;}
// else break;
// }
while(how[3])
{
if(how[2]>0&&how[1]>0) {res++;how[3]--;how[2]--;how[1]--;}
else break;
}
res+=(how[3]*3+how[2]*2)/6;
cout<<res;
return 0;
}
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复