摩拜单车
编程题三道
1、字符串
思路:移动A字符串,找出两个字符串不相等的位数。(前后可以填充为跟B完全一样)
void minDiff() {
string A, B;
getline(cin,A);
getline(cin, B);
int diff = B.size() - A.size();
int minD = 100;
for (int i = 0; i < diff+1; i++) {
int miss = 0;
for (int j = 0; j < A.size(); j++) {
if (A[j] != B[j + i])
miss++;
}
minD = minD > miss ? miss : minD;
}
cout << minD << endl;
}
2、有趣的排序
3、动态规划
void expectGift() {
int n, m;
cin >> n >> m;
int* c = new int[m];//每种礼物的数量
double expect=0;
for (int i = 0; i < m; i++)
cin >> c[i];
double** prob = new double*[n];//第i人选j的概率
for (int i = 0; i < n; i++) {
prob[i] = new double[m];
for (int j = 0; j < m; j++) {
cin >> prob[i][j];
}
}
vector<vector<double>> dp;//第i种礼物剩下j的概率
for (int i = 0; i < m; i++) {
dp.push_back(vector<double>(c[i]+1, 0.0));
dp[i][c[i]] = 1;//初始概率为1
}
for (int k = 0; k < n; k++) {//每个人依次取礼物
for (int i = 0; i < m; i++) {
if (c[i] != 0)
dp[i][0] = dp[i][0] + dp[i][1] * prob[k][i];
for (int j = 1; j < c[i]; j++)
dp[i][j] = dp[i][j] * (1 - prob[k][i]) + dp[i][j + 1] * prob[k][i];
dp[i][c[i]] *= 1 - prob[k][i];
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j <= c[i]; j++)
expect += dp[i][j] * (c[i] - j);
}
cout << setiosflags(ios::fixed)<<setprecision(1) << expect << endl;
}