9.26 360笔试第一题AC代码
排序标准是先排加速度从大到小,如果相等排序时间从大到小。
#include <iostream> #include <vector> #include <algorithm> using namespace std; bool greater_vec(vector<int> a, vector<int> b) { if (a[0] > b[0]) return true; else if (a[0] == b[0]) return a[1] > b[1]; else return false; } int main() { int n; cin >> n; vector<vector<int>> acc(n, vector<int>(2, 0)); for (int i = 0; i < n; i++) cin >> acc[i][0] >> acc[i][1]; sort(acc.begin(), acc.end(), greater_vec); double v = 0; double s = 0; for (int i = 0; i < n; i++) { double a = acc[i][0]; double t = acc[i][1]; s += v*t + 0.5*a*t*t; v += a*t; } printf("%.1f", s); return 0; }第二题73%代码,滑动窗口方式计算区间和,如果滑动窗口右侧的数比当前平均值大,扩展滑动窗口,否则在下一个位置进行滑动窗口操作。
#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> a(n, 0); int tmp = 0; double max = 0; double cur; for (int i = 0; i < n; i++) cin >> a[i]; int i = 0; int j = m - 1; for (int k = 0; k < m; k++) tmp += a[k]; while (i < n - m && j < n) { cur = (double)tmp / (j - i + 1); if (cur > max) max = cur; if (j<n-1 && a[j + 1]>cur) { j++; tmp += a[j]; } else { i++; if (i < n - m) { j = i + m - 1; tmp = 0; for (int k = i; k <= j; k++) tmp += a[k]; } } } printf("%.3f\n", max); return 0; }