网易互联网8.8笔试
此贴仅仅纪念自己笔试情况留念!见谅,因为做的不好!希望亲爱的同学们不要喷,更希望你们可以留言回复你们的解法情况!非常感谢!
第一题:给一个字符串,可以在右边无限添加字符,问能构成的最短的回文字符串是什么?输出即可!
思路:找出最右边的能构成回文的最长长度,然后再在右边添加左边一部分(反向)的长度个数量的回文字符即可,
代码:
#include<bits/stdc++.h> using namespace std; bool ispalindrom(string& s, int l, int r) { while(l < r) { if(s[l++] != s[r--]) return false; } return true; } int main(void) { #ifndef ONLINE_JUDGE ifstream cin("in.txt"); #endif //faster_cin_cout; int n; string s; while(cin >> s) { if(s.size() == 0) cout << "" <<endl; else { int rightLen = 0; for(int i = 0; i < s.size(); i++) { if(ispalindrom(s, i, s.size()-1)) { rightLen = s.size() - i; break; } } n = s.size(); int k = n - rightLen - 1; while(k >= 0) s.push_back(s[k--]); cout << s << endl; } } return 0; }
第二题:给n个数,如果按照平分的话,问最后最少删除的数的总量是多少?
思路:因为数据不大(n <= 15),直接最多秒枚举2^15个状态,本质就是01背包问题,
然后看 i 和 2*i是否分别都存在,其中2*i <= sum, sum 为n个元素的和!
代码:
#include<bits/stdc++.h> using namespace std; int main(void) { #ifndef ONLINE_JUDGE ifstream cin("in.txt"); #endif int t; int n; cin >> t; while(t--) { cin >> n; vector<int> a(n+1, 0); int sum = 0; for(int i = 1; i <= n; ++i) cin >> a[i], sum += a[i]; vector<bool> f(sum+1, 0); int size = (1<<n); for(int stat = 0; stat < size; ++stat) { int s = 0; int t = 1; for(int i = 1; i <= n; ++i, t<<=1) { if(stat&t) s += a[i]; } f[s] = true; } int ans = 0; for(int i = sum/2; i >= 1; --i) { if(f[i] && f[i<<1]) { ans = i; break; } } cout << sum - 2*ans << endl; } return 0; }
第三题:给出个顾客买东西需要花费的时间 a[i],并且每一个顾客可以和前面一个顾客一起买东西的时间b[i],
问最少需要多少时间,这n个顾客可以全部买完,
思路:每一个顾客的购买方式有两种方法(单独买,或者跟前面一个人一起买),除了第一个顾客,
可以进行两种状态转移!
代码:
#include<bits/stdc++.h> using namespace std; void PRINTF(int times) { int hour = times / 3600; times %= 3600; int minute = times / 60; times %= 60; int second = times; if(hour < 4) { printf("%02d:%02d:%02d am\n", 8+hour, minute, second); } else { printf("%02d:%02d:%02d pm\n", 8+hour, minute, second); } } int main(void) { #ifndef ONLINE_JUDGE ifstream cin("in.txt"); #endif //faster_cin_cout; int t; int n; cin >> t; while(t--) { cin >> n; vector<int> a(n+1, 0), b(n+1, 0); for(int i = 1; i <= n; ++i) cin >> a[i]; if(n == 1) { PRINTF(a[1]); continue; } for(int i = 2; i <= n; ++i) cin >> b[i]; vector<int> f(n+1, 0x3f3fffff), pre(n+1, 0); f[0] = 0; for(int i = 1; i <= n; ++i) f[i] += f[i-1] + a[i]; for(int i = 2; i <= n; ++i) { f[i] = min(f[i], min(f[i-1] + a[i], f[i-2] + b[i])); } PRINTF(f[n]); } return 0; }
第四题:给出n个人,以及他们之间的m对关系,x y 表示x 认可y,请问他们相互认可的总数有多少对?
思路:暂时只能暴力搜索!希望大佬可以留下你们的优美解法
代码:
#include<bits/stdc++.h> using namespace std; int n, m; void dfs(vector<vector<int>>& tree, vector<vector<char>>& cnt, int u, int fa) { for(int v : tree[u]) { cnt[fa][v]++; cnt[u][v]++; dfs(tree, cnt, v, fa); } } int main(void) { #ifndef ONLINE_JUDGE ifstream cin("in.txt"); #endif //faster_cin_cout; int u, v; while(cin >> n >> m) { vector<vector<int>> tree(n+1, vector<int>()); vector<vector<char>> cnt(n+1, vector<char>(n+1, 0)); for(int i = 1; i <= m; ++i) { cin >> u >> v; tree[u].push_back(v); } for(int i = 1; i <= n; ++i) { dfs(tree, cnt, i, i); } int ans = 0; for(int i = 1; i <= n; ++i) { for(int j = i+1; j <= n; ++j) { if(cnt[i][j] && cnt[j][i]) ++ans; } } cout << ans << endl; } return 0; }