打卡信奥刷题(2141)用C++实现信奥 P12168 [蓝桥杯 2025 省 C/Python A/Java A] 拼好数
·
P12168 [蓝桥杯 2025 省 C/Python A/Java A] 拼好数
题目描述
我们将含有不少于 666 个 666 的数视为一个好数。例如 666666666666666666、162636465666162636465666162636465666 是好数,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 201≤n≤20;
- 对于所有评测用例,1≤n≤10001 \leq n \leq 10001≤n≤1000,0≤ai≤1090 \leq a_i \leq 10^90≤ai≤109。
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
更多推荐


所有评论(0)