USACO Section 2.2 Runaround Numbers - 又一个枚举的思想

本文介绍了一种用于查找特定数列的高效算法。通过枚举所有可能的数列并进行判断,确保了查找过程的准确性。算法利用递归和回溯技巧,确保了在限定条件下生成的所有数列都是有序的,从而简化了后续查找步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目说的这种数长度最多为9,每位都不重复..并且没有0..所以如果事先枚举所有这些数再判断的话需要枚举的个数是9!=362880...才30多W~~果断先枚举出可能的所有情况~~就按题目要求的判断下~~枚举的同时就能保证是有序的~~所以后来的查找输出就从1开始找到第一个大于输入的数就ok了...

Program:

/* ID: zzyzzy12 LANG: C++ TASK: runround */ #include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> #include<queue> using namespace std; long long n,ans[1000001]; int num,s[10],p; bool used[10],f[10]; bool ok() { int i=1,k,j,num=p; memset(f,0,sizeof(f)); while (num--) { k=i; for (j=1;j<=s[i];j++) { k++; if (k==p+1) k=1; } if (f[k]) return false; f[k]=true; i=k; } return true; } void search(int n) { int i; if (n==p+1) { if (ok()) { ans[++num]=0; for (i=1;i<=p;i++) ans[num]=ans[num]*10+s[i]; } return; } for (i=1;i<=9;i++) if (!used[i]) { used[i]=true; s[n]=i; search(n+1); used[i]=false; } return; } int main() { freopen("runround.in","r",stdin); freopen("runround.out","w",stdout); num=0; for (p=1;p<=9;p++) { memset(used,false,sizeof(used)); search(1); } cin>>n; int i; for (i=1;i<=n;i++) if (ans[i]>n) break; cout<<ans[i]<<endl; return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值