USACO--2.2Runaround Numbers

开始的时候认为数据太大,直接模拟会超时,但其实还是可以直接模拟的,原因在于这种Runaround Numbers分布还比较稠密。另外要注意读题.

代码如下:

/*
ID:15674811
LANG:C++
PROG:runround
*/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<fstream>
using namespace std;

int conut(int *vis,int cnt)
{
    int tmp=0;
    for(int i=0;i<cnt;i++)
        if(vis[i])
           tmp++;
    return tmp;
}

bool check(long long n)
{
    long long x=n;
    int vis[20];
    int a[20];
    memset(vis,0,sizeof(vis));
    int cnt=0;
    while(x)
    {
        cnt++;
        x/=10;
    }
    int m=cnt;
    cnt--;
    while(n)
    {
        a[cnt]=n%10;
        vis[a[cnt]]++;
        if(a[cnt]==0)
            return false;
        n/=10;
        cnt--;
    }
    for(int i=1;i<=9;i++)
        if(vis[i]>=2)
           return false;
    int cur=0;
    cnt=0;
    memset(vis,0,sizeof(vis));
    vis[0]=1;
    while(true)
    {
        int t=(cur+a[cur])%m;
        if((conut(vis,m)==m)&&(t==0))
            return true;
        if(vis[t])
            return false;
        if(conut(vis,m)>=m)
            return false;
        vis[t]=1;
        cur=t;
    }
}

int main()
{
     ofstream fout("runround.out");
     ifstream fin("runround.in");
     //ifstream fin("lkl.txt");
     long long n;
     while(fin>>n)
     {
         n++;
         while(true)
         {
             if(check(n))
                break;
             n++;
         }
         fout<<n<<endl;
     }
  return 0;
}
时间: 2024-11-07 08:50:58

USACO--2.2Runaround Numbers的相关文章

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 3.1 Humble Numbers

给出K个素数,从这些数中取出任意个,每个数乘上任意遍,得到的这些数的集合叫做丑数,求集合中第N小的数. 一般的做法是,将这些素数放入优先队列,将队首元素弹出,将这个队首元素乘上每个素数的结果存入队列,从队列中pop出的第N个数就是第N小. 但这种做法在一些特殊输入下会导致队列内存爆掉. 另一种效率更高的的做法是:给每个素数设置一个计数器,计数器中的值表示它和已知的前i小个丑数已经乘 /* ID: modengd1 PROG: humble LANG: C++ */ #include <iostr

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 Section2.2 Runaround Numbers 解题报告 【icedream61】

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

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>

【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 Humble Numbers

这道题的意思是给你一个素数的集合, 定义丑数为集合中的数相乘, 问你第N个丑数是多少?假设我们现在已经得到了n个丑数, 要寻找地n+1个丑数的话就用当前的素数乘以之前得到的丑数之后找出大于最后一个丑数的最小值即可,代码如下: /* ID: m1500293 LANG: C++ PROG: humble */ #include <cstdio> #include <cstring> #include <algorithm> #include <queue> s

洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]

P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其 它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”.所有答案可以用longint(32位整数)存储. 补充:丑数集合中每个数从小到大排列,每个丑

POJ 3252 Round Numbers

Round Numbers Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12824   Accepted: 4946 Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, Paper, Stone' (also known as 'Rock, Paper, Scissors',