P12168 [蓝桥杯 2025 省 C/Python A/Java A] 拼好数

题目描述

我们将含有不少于 666666 的数视为一个好数。例如 666666666666666666162636465666162636465666162636465666 是好数,123666661236666612366666 不是好数。

给定 nnn 个正整数 aia_iai,你可以把这些数分成若干组拼起来,每组内的数可以按任意顺序拼,但一组最多只能有 333 个数。求最多可以得到多少个好数。

输入格式

输入的第一行包含一个正整数 nnn

第二行包含 nnn 个正整数 a1,a2,⋯ ,ana_1, a_2, \cdots, a_na1,a2,,an,相邻整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案,即最多可以得到的好数的数量。

输入输出样例 #1

输入 #1

3
66 66 66

输出 #1

1

输入输出样例 #2

输入 #2

7
666666 16166 6696 666 6 6 6

输出 #2

2

说明/提示

评测用例规模与约定

  • 对于 20%20\%20% 的评测用例,1≤n≤201 \leq n \leq 201n20
  • 对于所有评测用例,1≤n≤10001 \leq n \leq 10001n10000≤ai≤1090 \leq a_i \leq 10^90ai109

C++实现

#include<bits/stdc++.h>
using namespace std;
int n,f[7];
int pinhaofan(int x){
    int cnt=0;
    while(x>0){
        if(x%10==6) cnt++;
        x/=10;
    }if(cnt>6) cnt=6;
    return cnt;
}signed main(void){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        int p;
        scanf("%d",&p);
        f[pinhaofan(p)]++;
    }int pnt=1;
    while(f[5]>0){
        if(int(pnt==5)>=f[pnt]) pnt++;
        f[6]++;
        f[5]--;
        f[pnt]--;
    }while(f[4]>0&&f[1]>1){
        f[4]--;
        f[1]-=2;
        f[6]++;
    }pnt=2;
    while(f[4]>0){
        if(int(pnt==4)>=f[pnt]) pnt++;
        f[6]++;
        f[4]--;
        f[pnt]--;
    }while(f[3]&&f[2]&&f[1]){
        f[3]--;
        f[2]--;
        f[1]--;
        f[6]++;
    }f[6]+=(3*f[3]+2*f[2])/6;
    printf("%d\n",f[6]);
    return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐