关闭

usaco runround

310人阅读 评论(0) 收藏 举报

一个纯粹的模拟题。

/*
ID: stormdp1
LANG: C++
TASK: runround
*/
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

bool judge[10];
int digit[20];
long long n;
int len;

bool isOk()
{
    memset(judge, false, sizeof(judge));
    int times = digit[len-1];
    int done = 1;
    int place = len - 1;

    judge[times] = true;
    while(done <= len) {
        place = (place - times + 10 * len) % len;   //这里给len乘上10,不然len比较短而数字比较大时会出错
        times = digit[place];
        done++;
        judge[times] = true;
    }
    
    for(int i = 0; i < len - 1; i++) {
        if(!judge[digit[i]])
            return false;
    }
    if(place != len - 1)
        return false;
    return true;
}

int main()
{
    freopen("runround.in", "rb", stdin);
    freopen("runround.out", "wb", stdout);    
    scanf("%lld", &n);
    for(long long t = n + 1; ; t++) {
        bool flag = true;
        long long tmp = t;
        len = 0;
        memset(judge, false, sizeof(judge));
        while(tmp) {      //判断0和重复数字
            int a = tmp % 10;
            if(a == 0) {
                flag = false;
                break;
            }
            if(judge[a]) {
                flag = false;
                break;
            }
            else {
                judge[a] = true;
            }
            digit[len] = a;     //预处理出各个位
            len++;
            tmp /= 10;
        }
        if(flag && isOk()) {
            printf("%lld\n", t);
            return 0;
        }
    }
    fclose(stdin);
    fclose(stdout);
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:96473次
    • 积分:2026
    • 等级:
    • 排名:第19617名
    • 原创:111篇
    • 转载:1篇
    • 译文:1篇
    • 评论:26条
    文章分类
    最新评论