2018 迅雷校招程式設計題
阿新 • • 發佈:2018-12-11
第一題,就是找素勾股數,一開始想到用公式直接算,交上去沒能全部通過,後面腦子一熱,就直接暴力了一發,算是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; }