华为笔试部分题解。。

1.题意:问到最后一个的最短步数,要求第一步不能超过len/2
考虑到第一步不能超过len/2,我就直接用暴力dfs了(没想到更好的)。。
还有一个点就是它需要恰好到达最后一个,不能超过(leetcode某题是可以超过)
AC代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <string>
#include <math.h>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#pragma warning(disable:4996)

#define ll long long
using namespace std;
vector<int>anss;
vector<int> a;
void dfs(int pos,int dep) {
	if (pos > a.size() - 1)
		return ;
	if (pos == a.size() - 1) {
		anss.push_back(dep);
		return;
	}
	int mxlen;
	if (pos == 0) {
		mxlen = a.size() / 2;
		for (int i = 1; i < mxlen; ++i) {
			dfs(i, dep + 1);
		}
	}else {
		mxlen = a.size();
		dfs(pos + a[pos], dep + 1);
	}
}

int main() {
	anss.clear();
	a.clear();
	int i = 0;
	do {
		cin >> i;
		a.push_back(i);
	} while (getchar() != '\n');
	dfs(0, 0);
	sort(anss.begin(), anss.end());
	if (anss.size() == 0)
		cout << -1 << endl;
	else
		cout << anss[0] << endl;
	return 0;
}
2. Polya定理。。。好像是裸题,但是一开始没过,因为没考虑到mod,后面加了一个逆元就过了。。。代码就不贴了(用的模板)
#笔试题目##华为##题解#
全部评论
看到此时第一个第二题a的大佬Polya定理
点赞 回复 分享
发布于 2019-09-07 21:32
最后五分钟反应过来已经来不及了...
点赞 回复 分享
发布于 2019-09-07 21:35
 l = list(map(int,input().split(" "))) countlist = [] a = 0 for i in range(len(l)/2):     loc = l[i]     count = 0     while loc+l[loc] <= len(l):         loc = l[loc+l[loc]]         count += 1     else:         print(-1)     if a == 0 or a >= count:         a = count     else:         pass print(a)
点赞 回复 分享
发布于 2019-09-07 21:23
大佬有第三题的题解吗,前两题,感觉还可以都是模板。
点赞 回复 分享
发布于 2019-09-07 21:52
大佬🐮🍺
点赞 回复 分享
发布于 2019-09-07 21:54
大神求个第二题正确答案。没答案不敢确定自己想的对错,打扰您了。
点赞 回复 分享
发布于 2019-09-15 23:40
看不懂polya定理。。。
点赞 回复 分享
发布于 2019-09-18 15:56

相关推荐

Ivew:好像没啥问题,你没签,其他人签了,人招满了不招正常做法。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
2 27 评论
分享
牛客网
牛客企业服务