2018頭條春招筆試題解
阿新 • • 發佈:2019-02-12
頭條測試: https://blog.csdn.net/flushhip/article/details/79562199
第一題: 雙指標:
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e6+7; int a[N]; int main() { int n,k; scanf ( "%d%d" ,&n,&k); for ( int i=0;i<n;++i) scanf ( "%d" ,&a[i]); sort(a, a+n); n = unique(a, a+n) -a; int r = 0, ans=0; for ( int l=0; l<n;++l) { while (r<n&&a[r]-a[l]<k) ++r; if (r==n) break ; if (a[r]-a[l] == k) ++ans; } printf ( "%d\n" , ans); return 0; } |
#include <bits/stdc++.h> using namespace std; typedef pair< int , int > pii; map<pair< int , int > , int > mp; int main() { int n; scanf ( "%d" ,&n); queue<pii> q; q.push(make_pair(1, 1)); mp[make_pair(1,1)]=0; while (!q.empty()) { pii pr = q.front();q.pop(); // printf("%d %d\n",pr.first, pr.second); if (pr.first == n) { printf ( "%d\n" , mp[pr]); exit (0); } pii t=pr; t.second = t.first; t.first*=2; if (!mp.count(t)) { q.push(t); mp[t] = mp[pr]+1; } t=pr; t.first=t.first+t.second; if (!mp.count(t)) { q.push(t); mp[t] = mp[pr]+1; } } return 0; } |
#include <bits/stdc++.h> using namespace std; typedef long long ll; char s[107]; char G[5][10][8] = { { "66666" , "....6" , "66666" , "66666" , "6...6" , "66666" , "66666" , "66666" , "66666" , "66666" }, { "6...6" , "....6" , "....6" , "....6" , "6...6" , "6...." , "6...." , "....6" , "6...6" , "6...6" }, { "6...6" , "....6" , "66666" , "66666" , "66666" , "66666" , "66666" , "....6" , "66666" , "66666" }, { "6...6" , "....6" , "6...." , "....6" , "....6" , "....6" , "6...6" , "....6" , "6...6" , "....6" }, { "66666" , "....6" , "66666" , "66666" , "....6" , "66666" , "66666" , "....6" , "66666" , "66666" } }; ll cal() { int n = strlen (s); ll sum=0, cur=0, prd=1; for ( int i=0; i<n; ++i) { if ( isdigit (s[i])) cur=cur*10+s[i]- '0' ; else if (s[i] == '-' ) { sum+=prd*cur; cur=0; prd=-1; } else if (s[i] == '+' ) { sum+=prd*cur; cur=0; prd=1; } else { prd*=cur; cur=0; } } return sum+prd*cur; } int main() { int T; scanf ( "%d" ,&T); while (T--) { scanf ( "%s" , s); ll ans = cal(); for ( int i=0; i<5; ++i) { vector< int > v; ll tmp = ans; while (tmp) v.push_back(tmp%10),tmp/=10; reverse(v.begin(), v.end()); if (v.empty()) v.push_back(0); for ( int j=0; j<v.size(); ++j) { printf ( "%s%s" ,G[i][v[j]], j+1==v.size()? "\n" : ".." ); } } } return 0; } |
1 |
放數只能放沒出現過的數
從小的數開始放可以使均值小的集合均值上升慢,均值大的集合均值上升快,這樣最優。
#include <bits/stdc++.h> using namespace std; typedef long long ll; set< int > sa,sb; ll suma, sumb; const long double eps = 1e-14; inline int cmp( long double a, long double b) { if ( fabs (a-b) <= eps) return 0; return a>b?1:-1; } inline long double jz(ll k, int m) { return ( long double )k/m; } int main() { int n,m; scanf ( "%d%d" ,&n,&m); for ( int i=0; i<n;++i) { int t; scanf ( "%d" ,&t); sa.insert(t); suma+=t; } for ( int i=0;i<m;++i) { int t; scanf ( "%d" ,&t); sb.insert(t); sumb+=t; } if (cmp(jz(suma, n), jz(sumb, m))==-1) { swap(suma, sumb); swap(n, m); sa.swap(sb); } int mx =n; int ans = 0; for (auto k : sa) { if (cmp(k, jz(suma, n)) >= 0) break ; // printf("%d %d\n",n, k); if (!sb.count(k)&&cmp(k, jz(sumb, m))>0) { ++ans; sumb+=k; suma-=k; sb.insert(k); --n;++m; } } printf ( "%d\n" , ans); |
第五題:BFS
#include <bits/stdc++.h> using namespace std; const int N = 1e5+1000; typedef pair< int , int > pii; bool vis[N]; int a[N]; int main() { int n,k,h; scanf ( "%d%d%d" ,&n,&k,&h); for ( int i=0;i<n;++i) { int t; scanf ( "%d" ,&t); a[t]=1; } queue<pii> q; q.push({0,0}); int ans = 0; while (!q.empty()) { pii p = q.front(); q.pop(); if (p.second>k) break ; ans = max(ans, p.first); for ( int i=1; i<=h; ++i) { if (a[p.first + i]&&!vis[p.first+2*i]) { vis[p.first+2*i]= true ; q.push(make_pair(p.first+2*i, p.second+1)); } if (p.first-2*i>0&&a[p.first-i]&&!vis[p.first-2*i]) { vis[p.first-2*i]= true ; q.push(make_pair(p.first-2*i, p.second+1)); } } } printf ( "%d\n" , ans); return 0; } |