Infinite Fraction Path

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 5756    Accepted Submission(s): 1142

Problem Description
The ant Welly now dedicates himself to urban infrastructure. He came to the kingdom of numbers and solicited an audience with the king. He recounted how he had built a happy path in the kingdom of happiness. The king affirmed Welly’s talent and hoped that this talent can help him find the best infinite fraction path before the anniversary.
The kingdom has N cities numbered from 0 to N - 1 and you are given an array D[0 ... N - 1] of decimal digits (0 ≤ D[i] ≤ 9, D[i] is an integer). The destination of the only one-way road start from the i-th city is the city labelled (i2 + 1)%N.
A path beginning from the i-th city would pass through the cities u1,u2,u3, and so on consecutively. The path constructs a real number A[i], called the relevant fraction such that the integer part of it is equal to zero and its fractional part is an infinite decimal fraction with digits D[i], D[u1], D[u2], and so on.
The best infinite fraction path is the one with the largest relevant fraction
 
Input
The input contains multiple test cases and the first line provides an integer up to 100 indicating to the total numberof test cases.
For each test case, the first line contains the integer N (1 ≤ N ≤ 150000). The second line contains an array ofdigits D, given without spaces.
The summation of N is smaller than 2000000.
 
Output
For each test case, you should output the label of the case first. Then you are to output exactly N characters which are the first N digits of the fractional part of the largest relevant fraction.
 
Sample Input
4
3
149
5
12345
7
3214567
9
261025520
 
Sample Output
Case #1: 999
Case #2: 53123
Case #3: 7166666
Case #4: 615015015
 
Source
 
Recommend
jiangzijing2015   |   We have carefully selected several similar problems for you:  6730 6729 6728 6727 6726 
 
这题要注意的细节还是有点多的,算是比较细腻处理的bfs的题目了.
 /*************************************************************************
> File Name: hdu-6223.infinite_fraction_path.cpp
> Author: CruelKing
> Mail: 2016586625@qq.com
> Created Time: 2019年09月18日 星期三 15时57分37秒
本题思路:BFS暴力,先找出最大的几个数的位置,接着bfs每次寻找下一层最大的值,直到
找到答案为止.
注意剪枝:1.如果在当前层寻找到了比最大值小的值直接pop.
2.如果当前层有多个结点通往下一层的同一个结点,只需要保留一个就行了.
************************************************************************/ #include <cstdio>
#include <queue>
#include <cstring>
using namespace std; typedef long long ll; const int maxn = + ;
char str[maxn], ans[maxn]; int M[maxn], tot;
bool vis[maxn]; int n; ll sta[maxn], top; struct node {
ll index, step;
}; bool operator < (node a, node b) {
if(a.step == b.step) return str[a.index] < str[b.index];
return a.step > b.step;
} void bfs() {
priority_queue <node> que;
for(int i = ; i < tot; i ++) {
que.push((node) {M[i], });//最大值入队列
}
ll last = ;
while(!que.empty()) {
node now = que.top();
que.pop();
if(last != now.step) {
last = now.step;
while(top) vis[sta[-- top]] = false;//把当前标记过得结点都释放,因为他们还可以继续访问
}
if(ans[now.step] > str[now.index] || now.step >= n || vis[now.index]) continue;//如果在当前层当前位置已经被访问过了就跳过这个结点, 如果当前已经找到了n个数就跳过这个结点,如果已经当前结点字典序小于之前访问过的最大值就跳过这个结点
sta[top ++] = now.index;//把当前访问的结点放入队列并标记
vis[now.index] = true;
ans[now.step] = str[now.index];//更新答案
que.push((node) {(now.index * now.index + ) % n, now.step + });//跳跃
}
while(top) vis[sta[-- top]] = false;
ans[n] = '\0';
} int _case; void print() {
printf("Case #%d: %s\n", ++_case, ans);
} int main() {
int t, _case = ;
int Max;
char k;
scanf("%d", &t);
while(t --) {
for(int i = ; i < n; i ++) ans[i] = ;
k = ;
tot = ;
scanf("%d", &n);
scanf("%s", str);
for(int i = ; i < n; i ++) {
if(str[i] > k) {
k = str[i];
}
}
for(int i = ; i < n; i ++) {
if(str[i] == k) {
M[tot ++] = i;//存储字符串中的最大值
}
}
bfs();
print();
}
return ;
}
05-11 20:19