2017 ICPC/ACM 沈阳区域赛HDU6223

Infinite Fraction Path

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

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

分析   这道题写不出来 搜到大佬的题解 只有代码分析很少  只能看懂大佬代码  然后照着 敲一遍 不得不服大佬就是大佬写的代码很有感觉

按照 i ——> ( i ^ 2 + 1 ) % n  建图    bfs+剪枝

bfs + 剪枝

剪枝:

  • 值小于当前层最大值的点移出队列
  • 同一层在相同位置的移出队列

大牛博客   http://blog.csdn.net/qq_40482495/article/details/78492841

AC代码

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <string.h>
 4 #include <stdlib.h>
 5 #include <iostream>
 6 #include <sstream>
 7 #include <algorithm>
 8 #include <string>
 9 #include <queue>
10 #include <vector>
11 using namespace std;
12 const int maxn= 150000+10;
13 const int maxm= 1e4+10;
14 const int inf = 0x3f3f3f3f;
15 typedef long long ll;
16 ll ne[maxn];   //ne[i]为以i为起点的边的终点
17 int v[maxn],ans[maxn],vis[maxn];  //权值、答案、i上一次在ans数组中出现的位置
18 char s[maxn];
19 int n,t;
20 struct node
21 {
22     int v,pos,ans;   //表示当前节点的权值,下标i,在答案数组中的位置下标
23     node(){}
24     node(int v,int pos,int ans):v(v),pos(pos),ans(ans){}
25 };
26 struct compare
27 {
28     bool operator()(const node &a,const node &b) const   //ans最小值优先 权值最大值优先
29     {
30         if(a.ans!=b.ans) return a.ans>b.ans;
31         else if(a.v!=b.v) return a.v<b.v;
32         return a.pos>b.pos;
33     }
34 };
35 priority_queue<node,vector<node>,compare> q;
36 int main()
37 {
38     scanf("%d",&t);
39     int kase=1;
40     while(t--)
41     {
42         scanf("%d",&n);
43         scanf("%s",s);
44         memset(vis,-1,sizeof(vis));    //初始化
45         memset(ans,-1,sizeof(ans));
46         int ma=0;
47         for(int i=0;i<n;i++)            //权值转化为整数  求出最大值  i的终点(i^2+1)%n
48         {
49             v[i]=s[i]-‘0‘;
50             ma=max(ma,v[i]);
51             ne[i]=(((ll)i*(ll)i+1)%(ll)n);
52         }
53 //        for(int i=0;i<n;i++)
54 //        {
55 //            printf("%d %d %d\n",i,v[i],next[i]);
56 //        }
57 //        printf("%d\n",ma);
58         for(int i=0;i<n;i++)
59         {
60             if(v[i]==ma)
61                 q.push(node(ma,i,0));       //最大值先压入队列
62         }
63         while(!q.empty())
64         {
65             node t=q.top();q.pop();
66             if(ans[t.ans]==-1) ans[t.ans]=t.v;    //该位置初步确定一个值
67             if(ans[t.ans]>t.v) continue;          //该节点的权值比以前小  直接跳过
68             if(vis[t.pos]<t.ans) vis[t.pos]=t.ans;   //更新节点的 访问位置
69             else continue;
70             if(t.ans==n-1) continue;
71             q.push(node(v[ne[t.pos]],ne[t.pos],t.ans+1));  //加入新节点
72         }
73         printf("Case #%d: ",kase++);
74         for(int i=0;i<n;i++)
75             printf("%d",ans[i]);
76         printf("\n");
77     }
78     return 0;
79 }
时间: 2024-11-09 09:43:33

2017 ICPC/ACM 沈阳区域赛HDU6223的相关文章

2017年ICPC中国大陆区域赛真题(下)

2017年ICPC中国大陆区域赛真题(下) A - Lovers #include <bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,k,a[maxn],b[maxn],ans; int main() { int _; scanf("%d", &_); while (_--) { scanf("%d%d", &n, &k); for (int i =

2015年ACM长春区域赛比赛感悟

距离长春区域赛结束已经4天了,是时候整理一下这次比赛的点点滴滴了. 也是在比赛前一周才得到通知要我参加长春区域赛,当时也是既兴奋又感到有很大的压力,毕竟我的第一场比赛就是区域赛水平,还是很有挑战性的.在接到通知后,我便开始临阵抱佛脚,课也不怎么听了,上课把时间全都用在了看各种算法上,回到实验室便整理模板.开cf练手.在去比赛前,已经将所看过的算法模板都整理好了. 周五上午9点三刻左右,我们便出发了,需要经历12个小时才能到达我们此次的目的地——长春,途中我还将计算几何稍微看了一下.直到晚上11点

2014 acm亚洲区域赛(北京)总结

2014 acm/icpc 亚洲区域赛北京站    第一次到外面去比赛,周五下午做高铁到北京,报到注册后就去找在北京的同学玩了.    周六,上午,随便拉了个cf,我们随便看了下,没有写代码.下午的开幕式就那样,几个领导讲几句话,之后的热身赛,A题是数试题集出现多少次ACM,我们理解为在这题出现了多少次?第一次交了个17,wa掉了,交了个19,又wa了,后来好像又交了个13,都wa掉了,想哭了%>_<%,后面的D题更逗,给一段代码,判断是wa还是TLE,只有一个测试文件,并且样例数<=3

沈阳区域赛总结

[印象·沈阳] 是在去南阳的车上接到老师电话,问愿不愿意接着去沈阳,犹豫了一下,决定尝试一下,国赛结束后休整了两天,又启程去沈阳.这次去沈阳参加区域赛刷新了我的个人最北记录,先坐船去大连,再转车沈阳,到大连的时候下着小雨,挺清凉的,给人一种北国的温度.中午到了沈阳,出了火车站就有地铁,转一路地铁就看到了沈阳的真面目.相似的楼房,处处都有一种工业化的气息.宾馆不远,很快就到了.宾馆在东北大学东门外三好街上,是一条电子产业集散地,随处可见的电脑批发零售店,各种电脑城,有种到了北京中关村的感觉.进了东

2015沈阳区域赛Meeting(最短路 + 建图)

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 6865    Accepted Submission(s): 2085 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Jo

hdu6223 Infinite Fraction Path 2017沈阳区域赛G题 bfs加剪枝(好题)

题目传送门 题目大意:给出n座城市,每个城市都有一个0到9的val,城市的编号是从0到n-1,从i位置出发,只能走到(i*i+1)%n这个位置,从任意起点开始,每走一步都会得到一个数字,走n-1步,会得到一个长度为n的数列,输出能得到的最大的数列(当成数字). 思路: 一个数字肯定是最高位越大,这个数字本身就越大,所以肯定第一位要取最大值,在这一位取最大值的时候后面每一位都要尽量最大,所以想到bfs. 但是bfs肯定要剪枝,怎么剪枝呢? 1.按照思路,我要取每一位尽可能大的值,所以某一个状态的某

HDU 6229 Wandering Robots(2017 沈阳区域赛 M题,结论)

题目链接  HDU 6229 题意 在一个$N * N$的格子矩阵里,有一个机器人. 格子按照行和列标号,左上角的坐标为$(0, 0)$,右下角的坐标为$(N - 1, N - 1)$ 有一个机器人,初始位置为$(0, 0)$. 现在这个矩阵里面,有一些障碍物,也就是说机器人不能通过这些障碍物. 若机器人当前位置为$(x, y)$,那么他下一个位置有可能为与当前格子曼哈顿距离为$1$的所有格子的任意1个. 也有可能停留在原来的位置$(x, y)$ 求经过无限长的时间之后,这个机器人的位置在给定区

第39届ACM亚洲区域赛牡丹江赛区赛后总结

2014年10月10日,周五,早晨匆匆忙忙的出了寝室,直奔复印社去打了两份模板,然后直接就去上课了.第三节课下课,直接跟老师讲了一声,就去实验室跟学长们汇合了.12点半,踏上了开往牡丹江的列车,我们那节车厢俨然成了参赛队伍的专列了,背后坐的是吉大的,学生还没咋看,主要都看他们教练了,那肚子挺得,那得多腐败啊...旁边的是华南理工的,没想到旁边的那个妹纸,竟然是他们的教练!!!看着就是学生呀,竟然已经留校当教练了,唉,好可惜(你们懂得,嘿嘿~~~) 抵达牡丹江,这是我第二次踏上这块土地,当时想着这

hdu 5078 Osu! (2014 acm 亚洲区域赛鞍山 I)

题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5078 Osu! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 180    Accepted Submission(s): 114 Special Judge Problem Description Osu! is a very p