网易数据挖掘9.17 前两题ak代码
第一题,理解sql,意思是取参加两项活动以上的 按成绩降序名字升序排序输出
#include <bits/stdc++.h> using namespace std; bool isBigger(vector<string> a, vector<string> b) { int a_i = stoi(a[1]), b_i = stoi(b[1]); if (a_i != b_i) { return a_i > b_i; } else { return a[0] < b[0]; } } int main() { int n(0), m(0); cin >> n >> m; cin.ignore(); unordered_map<int, string> user; for (int i = 0; i != n; ++i) { string stemp; getline(cin, stemp); istringstream ss(stemp); int id(0), it(0); string user_name, sstemp; while (ss >> sstemp) { if (it == 0) { ++it; id = stoi(sstemp); continue; } if (it == 1) user_name = sstemp; } user.insert(pair<int, string>(id, user_name)); } unordered_map<int, unordered_map<string, int>> activity_record; for (int i = 0; i != m; ++i) { string stemp; getline(cin, stemp); istringstream ss(stemp); int id(0),score(0), it(0); string activity_id, sstemp; while (ss >> sstemp) { if (it == 0) { ++it; id = stoi(sstemp); continue; } if (it == 1) { ++it; activity_id = sstemp; continue; } if (it == 2) { score = stoi(sstemp); continue; } } auto prec = activity_record.find(id); if (prec != activity_record.end()) { if (prec->second.find(activity_id) != prec->second.end()) { prec->second.find(activity_id)->second += score; } else { prec->second.insert(pair<string, int>(activity_id, score)); } } else { unordered_map<string, int> mtemp; mtemp.insert(pair<string, int>(activity_id, score)); activity_record.insert(pair<int, unordered_map<string, int>>(id, mtemp)); } } vector<vector<string> > v_output; //map<string,int> output; for (auto it = activity_record.begin(); it != activity_record.end(); ++it) { auto msize = it->second.size(); if (msize >= 2) { int totalscore(0); for (auto itt = it->second.begin(); itt != it->second.end();++itt) { totalscore += itt->second; } //output.insert(pair<string, int>(user.find(it->first)->second,totalscore)); vector<string> vtemp = { user.find(it->first)->second ,to_string(totalscore) }; v_output.push_back(vtemp); } } sort(v_output.begin(), v_output.end(), isBigger); for (int i = 0; i != v_output.size(); ++i) { cout << v_output[i][0] << " " << v_output[i][1] << endl; } return 0; }第二题,永结无间,两边各用一次dp
#include <bits/stdc++.h> using namespace std; int main() { int T(0); cin >> T; for (int iter = 0; iter != T; ++iter) { int N(0), M(0); cin >> N >> M; vector<int> height(N + 2, 0); for (int i = 1; i <= N; ++i) cin >> height[i]; vector<vector<int> > dp(N + 2, vector<int>(2, 0)); dp[M][1] = 1; for (int i = M + 1; i <= N; ++i) { for (int j = M; j != i; ++j) { dp[i][0] = max(dp[j][1], dp[i][0]); dp[i][0] = max(dp[j][0], dp[i][0]); } bool peak = false; int max_height(height[i]); for (int j = i - 1; j >= M; --j) { bool isInvisible = false; if (height[j] >= max_height) { if(height[j]> max_height) peak = true; max_height = height[j]; } else { if (peak) isInvisible = true; } if (isInvisible) { if (dp[j][1] != 0) dp[i][1] = max(dp[i][1], dp[j][1] + 1); } } } for (int i = M - 1; i >= 1; --i) { for (int j = M; j != i; --j) { dp[i][0] = max(dp[j][1], dp[i][0]); dp[i][0] = max(dp[j][0], dp[i][0]); } bool peak = false; int max_height(height[i]); for (int j = i + 1; j <= M; ++j) { bool isInvisible = false; if (height[j] >= max_height) { if (height[j] > max_height) peak = true; max_height = height[j]; } else { if (peak) isInvisible = true; } if (isInvisible) { if(dp[j][1]!=0) dp[i][1] = max(dp[i][1], dp[j][1] + 1); } } } int max_ball = max(dp[N][1], dp[N][0]) + max(dp[1][1], dp[1][0]) - 2; cout << max_ball << endl; } return 0; }第三题,手写ann,挥手再见拜拜了您嘞,根本来不及写完全部过程,learning rate 部分都还没来得及写
using namespace std; double sigmoid(double x) { return 1 / (1 + exp(-x)); } double loss(double yhat, double y) { return (yhat - y) * yhat * (1 - yhat); } int main() { int d(0), q(0), l(0); cin >> d >> q >> l; int T(0); double eta(0.); cin >> T >> eta; int N(0); cin >> N; vector<vector<double> > V(q, vector<double>(d, 0)); for (int i = 0; i != q; ++i) { for (int j = 0; j != d; ++j) { cin >> V[i][j]; } } vector<vector<double> > W(l, vector<double>(q, 0)); for (int i = 0; i != l; ++i) { for (int j = 0; j != q; ++j) { cin >> W[i][j]; } } vector<vector<double> > data(N, vector<double>(d, 0)); for (int i = 0; i != N; ++i) { for (int j = 0; j != d; ++j) { cin >> data[i][j]; } } vector<vector<double> > target(N, vector<double>(l, 0)); for (int i = 0; i != N; ++i) { for (int j = 0; j != l; ++j) { cin >> target[i][j]; } } for (int iter = 0; iter != T; ++iter) { for (int iter_d = 0; iter_d != N; ++iter_d) { vector<double> middle_a(q, 0); for (int i = 0; i != q; ++i) { for (int j = 0; j != d; ++j) { middle_a[i] += V[i][j] * data[iter_d][j]; } middle_a[i] = sigmoid(middle_a[i]); } vector<double> middle_b(l, 0); for (int i = 0; i != l; ++i) { for (int j = 0; j != q; ++j) { middle_b[i] += W[i][j] * middle_a[j]; } middle_b[i] = sigmoid(middle_b[i]); if (i != l - 1) cout << fixed << setprecision(5) << middle_b[i] << " "; else cout << fixed << setprecision(5) << middle_b[i] << endl; } for (int i = 0; i != l; ++i) { middle_b[i] = middle_b[i] - eta * loss(target[iter_d][i], middle_b[i]) * middle_b[i]; } for(int i=0;i!=l;++i){ middle_b[i]= middle_b[i]-eta*loss(target[iter_d][i],middle_b[i])* middle_b[i]; } } } return 0; }