商汤算法今晚笔试编程题 1+1+0.6+0
1. 题目大意:批处理任务,求最短时间
#include <algorithm> #include <iostream> #include <vector> using namespace std; int main() { int n, c; cin >> n >> c; vector<int> t(n); for(int i = 0; i < n; ++i) { cin >> t[i]; } sort(t.begin(), t.end()); int res = 0; for(int i = n - 1; i >= 0; i -= c) { res += t[i]; } cout << res << endl; return 0; }
2. 题目大意:将 n 个整数变成 n 的一个排列所需要的操作次数。。。
#include <algorithm> #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> t(n); for(int i = 0; i < n; ++i) { cin >> t[i]; } sort(t.begin(), t.end()); int res = 0; for(int i = 0; i < n; ++i) { int diff = t[i] - (i + 1); res += diff >= 0 ? diff : -diff; } cout << res << endl; return 0; }
3. 题目大意:两人比赛。。。。。使用贪心算法。60%通过率。。。
#include <cmath> #include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<double> s(n); for(int i = 0; i < n; ++i) { double tmp; cin >> tmp; double pi = 1.0 / (1.0 + exp(-tmp)); if((i + 1) & 1) { double x = log(1 - pi); if(isinf(x)) { x = -tmp; } s[i] = i + 1 + x; } else { double x = log(pi); if(isinf(x)) { x = tmp; } s[i] = i + 1 + x; } } double score1 = 0.0, score2 = 0.0; int i = 0, j = n - 1; bool who = 1; // 1: first person, 0: second person while(i <= j) { if(s[i] > s[j]) { if(who) { score1 += s[i]; } else { score2 += s[i]; } i++; } else { if(who) { score1 += s[j]; } else { score2 += s[j]; } j--; } who = ~who; } if(score1 > score2) { cout << "TZ" << endl; } else { cout << "xtz" << endl; } return 0; }