来源:投稿 作者:LSC
编辑:学姐
拼多多总共4道编程题
1.字符串解码
输入: 3a3b2c
输出: aaabbbcc
用python做很方便
s = input()
l = len(s)
t = 0
ans = ""
for i in range(l):
if (s[i] >= 'a' and s[i] <= 'z') or (s[i] >= 'A' and s[i] <= 'Z'):
num = int(s[t:i])
t = i + 1
for _ in range(num):
ans += s[i]
print(ans)
2.T 个关卡,每个关卡 n 个敌人,每个敌人的耐受值已知。
每一关是独立的,你需要打败所有敌人,现在有两种操作:选择两个敌人,每个耐受值 -1。选择一个敌人,直接消灭。求打败当前关卡所有敌人所需要操作的最小次数。(当前关卡的操作不会影响到之后的关卡)
#define _NOT_SECURE_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<map>
#include<string>
using namespace std;
int t, n, ans = 0;
int d[1005][205] = { 0 };
int f(int a, int len)
{
if (len == 1) return 1;
if (len % 2 == 0)
{
if (a == 1) { return len / 2; }
return min((len / 2) * a, len);
}
if (a == 1)
{
return min(len, len / 2 + 1);
}
return len;
}
int main()
{
cin >> t >> n;
for (int i = 0; i < t; ++i)
{
for (int j = 0; j < n; ++j)
{
cin >> d[i][j];
}
}
for (int i = 0; i < t; ++i)
{
sort(d[i], d[i] + n);
ans = 0;
for (int j = 0; j < n; ++j)
{
int t = d[i][j];
int k = j;
while (k < n && t == d[i][k]) { k++; }
ans += f(t, k - j);
j = k - 1;
}
cout << min(ans, n) << endl;
}
return 0;
}
/*
3 3
1 2 1
2 3 2
1 2 3
2
3
3
*/
3.3 种活动,n 个员工每人可以选想去参加的活动志愿,但最终只能去一个。
每个活动有人数限制以及单位价格。问能否安排所有的人去参加活动,如果可以,求出最少花费,如果不行,输出最多可以安排多少人去参加。(n <= 100)。
正确而简单的思路是「最小费用流」。源点向每个人连流量 1,费用 0 的边,每个人向志愿连流量 1 费用 0 的边,每个志愿向汇点连流量为人数限制,费用为单位价格的边,然后直接跑模板即可。
参考大佬: https://www.nowcoder.com/discuss/464538407297994752?sourceSSR=search
也可以用dp,但是我不会想不出来。个人觉得用dfs也是可以拿一些分的,但是没写完。
4.求一组数据的平均数和中位数。
直接暴力,能过80%
n = int(input())
r = [int(i) for i in input().split(' ')]
avg, med = [], []
s = 0
l = len(r)
for i in range(l):
s += r[i]
avg.append(int(s / (i + 1) + 0.5))
t = int(i / 2)
p = sorted(r[:i + 1])
if i % 2 == 0:
med.append(p[t])
else:
med.append(int((p[t] + p[t + 1]) / 2 + 0.5))
for i in range(l):
if i != l - 1:
print(avg[i], end = " ")
else:
print(avg[i], end = "\n")
for i in range(l):
print(med[i], end = " ")
使用二分,acn = int(input())
r = [int(i) for i in input().split(' ')]
mean = []
avg, med = [], []
s = 0
l = len(r)
def find(a, t):
r = len(t)
if r == 0:
t.append(a)
return
if a >= t[r - 1]:
t.append(a)
return
if a <= t[0]:
t.insert(0, a)
return
l = 0
while l <= r:
mid = int((l + r) / 2)
if a >= t[mid]:
if mid < r - 1 and a <= t[mid + 1]:
t.insert(mid + 1, a)
return
l = mid + 1
else:
if mid >= 1 and a >= t[mid - 1]:
t.insert(mid, a)
return
r = mid - 1
return
for i in range(l):
s += r[i]
avg.append(int(s / (i + 1) + 0.5))
find(r[i], mean)
t = int(i / 2)
if i % 2 == 0:
med.append(mean[t])
else:
med.append(int((mean[t] + mean[t + 1]) / 2 + 0.5))
for i in range(l):
if i != l - 1:
print(avg[i], end = " ")
else:
print(avg[i], end = "\n")
for i in range(l):
print(med[i], end = " ")
关注下方《学姐带你玩AI》🚀🚀🚀
算法工程师万能简历公式+200多个简历模板(中英文)
回复“简历”轻松获取!
码字不易,欢迎大家点赞评论收藏!