【USACO题库】3.1.6 Stamps邮票
这一道题,算是我“千辛万苦”才做出来的吧。因为,我在时超70后代写了很久,才找出了一个能对但又不超时的方法。
下边,来说一说我的超时思想:
用i来枚举,从1一直到2000000,在一个个判断,知道i不可以结合出来就输出并结束程序,(呵呵,不超时的话,那就是相当于中了2亿元的大奖了)
好了看一看超时代吗:
#include<cstdio>
using namespace std;
int a[51],f[2000001];
bool bz[2000001];
int k,n;
bool pd(int x)
{
int i;
f[x]=666666666;
for (i=1;i<=x/2;i++)
{
if (bz[i]==true&&bz[x-i]==true)
{
bz[x]=true;
if (f[x]>f[i]+f[x-i]) f[x]=f[i]+f[x-i];
}
}
if (f[x]>k) return false;
else return bz[x];
}
int main()
{
int i,j;
scanf("%d%d",&k,&n);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
for (j=1;j<=k;j++)
{
bz[a[i]*j]=true;
f[a[i]*j]=j;
}
}
for (i=1;i<=2000000;i++)
{
if (bz[i]==true) continue;
else
{
if (pd(i)==true) continue;
else
{
printf("%d\n",i-1);
return 0;
}
}
}
printf("%d\n",i-1);
return 0;
//那个bz数组只是一个我自认为可以加一加速度的判断数组而已,不用在意这些细节。
}
好了,现在来说一说不会超时的简洁的短型代码吧!
其实是这样的:
f[i]表示的是凑成i分最少要多少张邮票,就是如下:
for (i=1;i<=2000000;i++)
{
f[i]=666666666;
for (j=1;j<=n;j++)
{
if (i-a[j]>=0&&f[i]>f[i-a[j]]+1) f[i]=f[i-a[j]]+1;
}
}
十分简单明了,下面来看一看判断语句吧:
if (f[i]>k)
{
printf("%d\n",i-1);
return 0;
}
是不是很简单,有没有想明白呢?
其实,这些USACO的题目是比较适合那些需要提高思维能力的人去做的,因为只有做了以后,你才能在思维上有了质的飞越,希望多多思考,争取能够独立完成USACO的所有题!
好了,废话也就说完了,下面来出一下完整代码:
#include<cstdio>
using namespace std;
int a[51],f[2000001];
int k,n;
int main()
{
int i,j;
scanf("%d%d",&k,&n);
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
for (i=1;i<=2000000;i++)
{
f[i]=666666666;
for (j=1;j<=n;j++)
{
if (i-a[j]>=0&&f[i]>f[i-a[j]]+1) f[i]=f[i-a[j]]+1;
}
if (f[i]>k)
{
printf("%d\n",i-1);
return 0;
}
}
printf("%d\n",i-1);
return 0;
}
转载需注明出处。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· DeepSeek智能编程
· 精选4款基于.NET开源、功能强大的通讯调试工具
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?