1. 程式人生 > >2018 迅雷校招程式設計題

2018 迅雷校招程式設計題

第一題,就是找素勾股數,一開始想到用公式直接算,交上去沒能全部通過,後面腦子一熱,就直接暴力了一發,算是N*N的複雜度,結果就AC了,感覺筆試都是用的銀河計算機???

#include<algorithm>
#include<iostream>
#include<stdio.h>
using namespace std;
int gcd(int b, int y) { return b > 0 ? gcd(y%b, b) : y; }
int main() {
	int n;
	while (cin >> n) {
		int ans = 0;
		for (int a = 3; a <= n; a++)
			for (int b = a + 1; b <= n; b++) {
				int c = sqrt(a*a + b * b);
				if (c*c == a * a + b * b &&c <= n && gcd(a, b) == 1 && gcd(b, c) == 1 && gcd(a, c) == 1)
					ans++;
			}
		cout << ans << endl;
	}
	return 0;
}

(我還記得上次某廠的1e5的資料可以N*N暴力過,感覺我們這些認真做題的就跟個傻逼一樣)

看到這道題,感覺有點複雜,結果一看資料範圍才17,暴力的最大複雜度也才2^17次方也就是1e5,那肯定就直接dfs暴力就完事兒了

#include<algorithm>
#include<iostream>
#include<stdio.h>
using namespace std;
int maxn, num[20], a, b;
void dfs(int ind) {
	if (ind == 17) {
		int ji = 1;
		for (int a = 0; a < 11 && ji; a++) {
			int sum = 0;
			for (int b = 0; b < 7; b++)
				sum += num[a + b];
			if (sum > 0)
				ji = 0;
		}
		if (ji) {
			ji = 0;
			for (int a = 0; a < 17; a++)
				ji += num[a];
			maxn = max(maxn, ji);
		}
		return;
	}
	num[ind] = a;
	dfs(ind + 1);
	num[ind] = b;
	dfs(ind + 1);
}
int main() {
	while (cin >> a >> b) {
		maxn = -(1e9);
		dfs(0);
		cout << maxn << endl;
	}
	return 0;
}