携程9.9算法笔试 零分卷
第一题用前缀和处理应该能全a的,但是我贪快就直接暴力加了,过了87%
int main() { int n(0), m(0), k(0); cin >> n >> m >> k; vector<vector<int> > mat(n, vector<int>(m, 0)); for (int i = 0; i != n; ++i) { for (int j = 0; j != m; ++j) { cin >> mat[i][j]; } } int max_num(0), current_num(0); for (int i = 0; i != n - k; ++i) { for (int j = 0; j != m - k; ++j) { current_num = 0; for (int iter_i = i; iter_i != i + k; ++iter_i) { for (int iter_j = j; iter_j != j + k; ++iter_j) { current_num += mat[iter_i][iter_j]; } } if (current_num > max_num) max_num = current_num; } } cout << max_num << endl; return 0; }第二题 直接模拟仓库操作,一共就0~10,1~500的数据范围,不知道为什么只过了27%,有人知道原因吗
bool isBigger(vector<int> a, vector<int> b) { return a[0] > b[0]; } int main() { vector<vector<int> > goods; int goods_num(0); int n(0); cin >> n; cin.ignore(); for (int iter = 0; iter != n; ++iter) { string input_command; getline(cin, input_command); vector<int> command; istringstream ss(input_command); string temp; while (ss >> temp) { command.push_back(stoi(temp)); } if (command[0] == 1) { int pos(-1); goods_num += command[1]; for (int i = goods.size() - 1; i >= 0; --i) { if (goods[i][0] == command[2]) { pos = i; goods[i][1] += command[1]; break; } } if (pos == -1) { vector<int> vtemp = { command[2],command[1] }; goods.push_back(vtemp); } sort(goods.begin(), goods.end(), isBigger); } else if (command[0] == 2) { if (command[1] <= goods_num) { cout << "yes" << endl; goods_num -= command[1]; int temp_num(command[1]); while (temp_num > 0) { if (temp_num < (goods.back())[1]) { (goods.back())[1] -= temp_num; temp_num = 0; } else { temp_num -= (goods.back())[1]; goods.pop_back(); } } } else { cout << "no" << endl; } } else if (command[0] == 3) { for (int i = goods.size() - 1; i >= 0; --i) { --goods[i][0]; } if ((goods.back())[0] <= 0) { goods_num -= (goods.back())[1]; goods.pop_back(); } } else if (command[0] == 4) { if (goods_num == 0) cout << 0 << endl; else { cout << (goods.back())[0] << endl; } } } return 0; }第三题 从根底部往上推,全过了
int main(){ int n(0),root(0); cin>>n>>root; vector<int> treenode(n+1,0); for(int i=1;i<=n;++i){ cin>>treenode[i]; } vector<int> node_deg(n+1,0); unordered_map<int,vector<int> > node_indeg; for(int i=0;i!=n-1;++i){ int node1(0),node2(0); cin>>node1>>node2; if(node_indeg.find(node1)==node_indeg.end()){ pair<int,vector<int>> ptemp(node1,{node2}); node_indeg.insert(ptemp); } else{ (node_indeg.find(node1)->second).push_back(node2); } if(node_indeg.find(node2)==node_indeg.end()){ pair<int,vector<int>> ptemp(node2,{node1}); node_indeg.insert(ptemp); } else{ (node_indeg.find(node2)->second).push_back(node1); } } while(node_indeg.size()>1){ vector<int> current_del; for(auto it=node_indeg.begin();it!=node_indeg.end();++it){ if((it->second).size()==1 and (it->first)!=root){ if(treenode[it->first]!=treenode[(it->second)[0]]){ node_deg[(it->second)[0]]+=(node_deg[it->first]+1); } else{ node_deg[(it->second)[0]]+=node_deg[it->first]; } current_del.push_back(it->first); int del_pos(0); for(int i=0;i!=((node_indeg.find((it->second)[0]))->second).size();++i){ if((node_indeg.find((it->second)[0])->second)[i]==it->first){ del_pos=i; break; } } ((node_indeg.find((it->second)[0]))->second).erase(((node_indeg.find((it->second)[0]))->second).begin()+del_pos); } } for(int i=0;i!=current_del.size();++i){ node_indeg.erase(current_del[i]); } } for(int i=1;i<=n;++i){ if(i!=n) cout<<node_deg[i]<<" "; else cout<<node_deg[i]; } return 0; }
所以第二题到底是为什么只过了27%?想了一个半小时都没想出来