网易数据挖掘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;
}
查看9道真题和解析