商汤算法今晚笔试编程题 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;
} 