USACO Runaround Numbers 模拟

根据题意的 Runaround 规则去找比当前数大的最近的一个 Runaround数字

模拟题~

Source code:

/*
ID: wushuai2
PROG: runround
LANG: C++
*/
//#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cmath>
#include <stack>
#include <string>
#include <map>
#include <set>
#include <list>
#include <queue>
#include <vector>
#include <algorithm>
#define Max(a,b) (((a) > (b)) ? (a) : (b))
#define Min(a,b) (((a) < (b)) ? (a) : (b))
#define Abs(x) (((x) > 0) ? (x) : (-(x)))
#define MOD 1000000007
#define pi acos(-1.0)

using namespace std;

typedef long long           ll      ;
typedef unsigned long long  ull     ;
typedef unsigned int        uint    ;
typedef unsigned char       uchar   ;

template<class T> inline void checkmin(T &a,T b){if(a>b) a=b;}
template<class T> inline void checkmax(T &a,T b){if(a<b) a=b;}

const double eps = 1e-7      ;
const int M = 660000         ;
const ll P = 10000000097ll   ;
const int INF = 0x3f3f3f3f   ;
const int MAX_N = 20         ;
const int MAXSIZE = 101000000;

ll num;
ll a[30];

void toStr(ll num){
    int i, j, k;
    memset(a, 0, sizeof(a));
    while(num){
        a[++a[0]] = num % 10LL;
        num /= 10LL;
    }
    for(i = 1; i <= a[0] / 2; ++i){
        swap(a[i], a[a[0] - i + 1]);
    }
}

void toNum(){
    int i, j, k;
    num = 0;
    ll nl = 1LL;
    for(i = a[0]; i >= 1; --i){
        num += nl * a[i];
        nl *= 10LL;
    }
}

bool solve(){
    int i, j, k, pos;
    ll ans[10];
    ll cur = a[1];
    ll b[30], bigg = 0;
    bool vis[30];
    memset(vis, 0, sizeof(vis));
    memset(ans, 0, sizeof(ans));
    for(i = 1; i <= a[0]; ++i){
        checkmax(bigg, a[i]);
        if(a[i] == 0)   return false;
        if(ans[a[i]])   return false;
        ans[a[i]] = true;
    }
    for(;;){
        memset(b, 0, sizeof(b));
        for(pos = 1; pos <= a[0]; ++pos){
            if(cur == a[pos])   break;
        }
        for(i = pos; i <= cur + pos - 1; ++i){
            b[++b[0]] = a[i % a[0] + 1];
        }
        /*
        for(i = 1; i <= b[0]; ++i){
            cout << b[i];
        }
        cout << endl;
        */
        if(vis[b[b[0]]]) return false;
        else vis[b[b[0]]] = true;
        for(i = 1; i <= bigg; ++i){
            if(vis[i] != ans[i])    break;
        }
        if(i == bigg + 1)   return true;
        cur = b[b[0]];
    }
}

int main() {
    ofstream fout ("runround.out");
    ifstream fin ("runround.in");
    int i, j, k, t, n, s, c, w, q;
    fin >> num;
    ++num;
    toStr(num);
    /*
    for(i = 1; i <= a[0]; ++i){
        cout << a[i];
    }
    cout << endl;
    */
    while(!solve()){
        //cout << num << endl;
        toNum();
        ++num;
        toStr(num);
    }
    fout << num << endl;

    fin.close();
    fout.close();
    return 0;
}
时间: 2024-10-26 16:29:02

USACO Runaround Numbers 模拟的相关文章

usaco Runaround Numbers

题意为一个数从最左边开始,往右数这个位上的个数个,然后这样走一圈,回到起点,每个数字都访问过且只访问一次,这个数字就是循环数 要求找出第一个比N大的循环数 /* ID: modengd1 PROG: runround LANG: C++ */ #include <iostream> #include <math.h> #include <stdio.h> #include <memory.h> using namespace std; bool isarro

USACO Section 2.2 Runaround Numbers

/* ID: lucien23 PROG: runround LANG: C++ */ #include <iostream> #include <fstream> #include <cstring> using namespace std; int main() { ifstream infile("runround.in"); ofstream outfile("runround.out"); if(!infile || !

USACO runaround

/* ID:kevin_s1 PROG:runround LANG:C++ */ #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <map> #include <set> #include <algorithm> #include <cstdlib&g

【USACO 2.2】Runaround Numbers

找出第一个大于n的数满足:每一位上的数都不同,且没有0,第一位开始每次前进当前这位上的数那么多位,超过总位数就回到开头继续往前进,最后能不能每个位都到过一次且回到第一位,$n<10^9$. 暴力,每次n++后模拟一边判断是否符合条件. /* TASK:runround LANG:C++ */ #include<cstdio> #include<cstring> using namespace std; int n; int get(int now,int step,int l

USACO Section2.2 Runaround Numbers 解题报告 【icedream61】

runround解题报告------------------------------------------------------------------------------------------------------------------------------------------------[题目] 给你一个数M,找出第一个比它大的循环数. 循环数:不包括0.没有重复数字,并且有循环性质的正整数. 循环性质:以81362为例 1.找到最高位,是8,那么往下数8位,依次是1,3

洛谷 P1467 [USACO2.2]循环数 Runaround Numbers

题目描述 循环数是那些不包括0且没有重复数字的整数(比如81362)并且还应同时具有一个有趣的性质, 就像这个例子: 如果你从最左边的数字开始(在这个例子中是8)向右数最左边这个数(如果数到了最右边就回到最左边),你会停止在另一个新的数字(如果停在一个相同的数字上,这个数就不是循环数).就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6 重复这样做 (这次从"6"开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6

USACO Wormholes(模拟)

题目请点我 题解: 这道题思路很简单,就是简单的深搜,找出所有的组合,然后判断能否成环.关键在于如何判断能否成环,我的思路是利用递归模拟,看能否第二次经过某一个点.中间也出现了错误,首先,每次访问的下一个点应该是同一行上当前点右边的第一个点:其次,某个点被访问过必须是作为起点被访问过,而不仅仅是到达. 代码实现: /* ID: eashion LANG: C++ TASK: wormhole */ #include <iostream> #include <cstdio> #inc

UVA 12050 - Palindrome Numbers 模拟

题目大意:给出i,输出第i个镜像数,不能有前导0. 题解:从外层开始模拟 #include <stdio.h> int p(int x) { int sum, i; for(sum=i=1;i<=x;i++) sum *= 10; return sum; } int main() { int n, i, j, t, cs[1000], c; while(~scanf("%d", &n)) { if(n==0) break; i=1; while(n>9*

LeetCode 2 Add Two Numbers 模拟,读题 难度:0

https://leetcode.com/problems/add-two-numbers/ You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked