洛谷 P1149「NOIP 2008 提高组」火柴棒等式
原题目传送门#
题解#
对我来说,这道题居然有点难想(来自蒟蒻的手动狗头
其实想来想去也没那么难。
首先先定义一个数组c[]
存储每一个数字(0-9)分别需要多少火柴棒来组成,然后再定义我们需要的a[]
数组(用来预处理)和变量num
,cnt
。
先从数据范围说起,因为最多只有2000,那么我们就把1到2000分别用火柴棒表示一下看需要多少个火柴棒。
for (int i=1;i<=2000;i++){
int tmp=i;
while(tmp>=1){
a[i]=a[i]+c[tmp%10];
tmp=tmp/10;
}
}
因为我们最终是连个数的和,那么就来一个双重循环i
和j
分别从0到1000进行枚举。
这里的a[i]
是第一个数,a[j]
是第二个数,a[i+j]
是a[j]
和a[i]
之和,最后还有一个4是因为+
号和=
号各自需要2根火柴棒组成。
for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++)
if (a[i]+a[j]+a[i+j]+4==num) cnt++;
}
最后,就直接看成品吧!
直接上代码(请抄袭(手动狗头#
#include <bits/stdc++.h>
#define size 5005
using namespace std;
int a[size]={6},c[10]={6,2,5,5,4,5,6,3,7,6};
int num,cnt=0;
int main(){
scanf("%d",&num);
for (int i=1;i<=2000;i++){
int tmp=i;
while(tmp>=1){
a[i]=a[i]+c[tmp%10];
tmp=tmp/10;
}
}
for (int i=0;i<=1000;i++){
for (int j=0;j<=1000;j++)
if (a[i]+a[j]+a[i+j]+4==num) cnt++;
}
printf("%d\n",cnt);
system("pause");
return 0;
}
作者:GTGumiiL
出处:https://www.cnblogs.com/GTGumiiL/p/15732497.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
记得关注呀~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】