hdu6223 Infinite Fraction Path【bfs+剪枝】

先提取出最大的值放进优先队列里面

优先队列先按步数小的先排,步数相同的按值大的优先

剪枝:

当前位的值比队列出来的值大的直接忽略;

但前走的下标已经被走过了且当前步数小于最大步数直接忽略。

AC_code:

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define maxn 150005

int num[maxn];
ll Next[maxn];
int ans[maxn];
int mark[maxn];
struct node {
	int v;
	int next;
	int step;
	ndoe() {
	};
	node(int _v, int _next, int _step) {
		v = _v;
		next = _next;
		step = _step;
	}
};
struct cmp {
	bool operator() (const node &a, const node &b) const {
		if(a.step == b.step) {
			return a.v < b.v;
		}
		return a.step > b.step;
	}
};

priority_queue<node, vector<node>, cmp> q;


int main() {
	//ios_base::sync_with_stdio(0);
	//cin.tie(0);
	int t;
	scanf("%d", &t);
	int cas = 1;
	while(t--) {
		int n;
		scanf("%d", &n);
		for(ll i = 0; i < n; i++) {
			scanf("%1d", &num[i]);
			Next[i] = (i*i+1)%n;
			mark[i] = -1;
			ans[i] = -1;
		}
		int maxx = -1;
		for(int i = 0; i < n; i++) {
			maxx = max(num[i], maxx);
		}
		for(int i = 0; i < n; i++) {
			if(num[i] == maxx) {
				q.push(node(maxx, i, 0));
			}
		}
		while(!q.empty()) {
			node temp = q.top();
			q.pop();
			if(ans[temp.step] == -1) {
				ans[temp.step] = temp.v;
			} else if(ans[temp.step] > temp.v) {
				continue;
			}

			if(mark[temp.next] < temp.step) {
				mark[temp.next] = temp.step;
			} else {
				continue;
			}
			if(temp.step == n-1) {
				continue;
			}
			q.push(node(num[Next[temp.next]], Next[temp.next], temp.step+1));
		}
		printf("Case #%d: ", cas++);
		for(int i = 0; i < n; i++) {
			printf("%d",ans[i]);
		}
		cout<<endl;
	}
}

 

全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 16:06
已编辑
快手电商 后端 23k-35k
点赞 评论 收藏
分享
11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务