USACO-Runaround Numbers(枚举)

来源:互联网 发布:公司网络有限制 编辑:程序博客网 时间:2024/05/16 01:16

题目链接:Runaround Numbers

因为每个数都不相同,所以可以枚举出所有的数,复杂度是 9!
排序后可以二分找答案。

/*ID: xdujlx1PROG: runroundLANG: C++*/#include<bits/stdc++.h>using namespace std;typedef long long ll;ll arr[100007];int a[11];bool vis[11];int k;void ioinit(){    freopen("runround.in","r",stdin);    freopen("runround.out","w",stdout);}void check(int *a, int n){    int cnt=0;    memset(vis,0,sizeof(vis));    int pos=0;    while(!vis[pos])    {        vis[pos]=true;        cnt++;        pos=(pos+a[pos])%n;    }    if(cnt==n&&pos==0)    {        ll res=0;        for(int i=0;i<n;i++)        {            res*=10;            res+=a[i];        }        arr[k++]=res;    }}bool used[11];void creat(int pos, int val){    if(!val)    {        check(a,pos);        return;    }    else    {        a[pos]=val;        check(a,pos+1);    }    for(int i=1;i<10;i++)        if(!used[i])    used[i]=true,creat(pos+1,i),used[i]=false;}int main(){    ioinit();    for(int i=1;i<10;i++)   used[i]=true,creat(0,i),used[i]=false;    //for(int i=0;i<k;i++)  cout << arr[i] << endl;    sort(arr,arr+k);    int n;    scanf("%d",&n);    int t=upper_bound(arr,arr+k,n)-arr;    cout << arr[t] << endl;    return 0;}
0 0
原创粉丝点击