您的位置:首页 > 其它

USACO Runaround Numbers 模拟

2015-02-17 20:16 316 查看
根据题意的 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: