编程题第一题和第二题 算法工程师的题一样 就不重复写了
请挑选以下卷积方式中的2种,通过公式、画图或者简单文字描述,阐述计算过程,分析各自的应用特点。 (1)组卷积 (Group Convolution) (2)深度可分离卷积 (Depthwise Separable Convolution) (3)空洞卷积 (Dilated Convolution) (4)可变形卷积 (Deformable Convolution) (5)反卷积 (Deconvolution\Transposed Convolution)
在日常深度学习模型训练的过程中,有时会出现机器GPU利用率较低的现象,请问出现这种现象时可以排查哪些可能的原因?在数据规模较大的情况下,通过哪些方法可能可以提升机器训练效率(可利用相关工具)?
小选线下店最近准备新上架一批长度不等的商品, 用一个数组表示商品的长度,已知货架每一层的长度固定为X。 小选线下店是一个追求生活美学的店铺,为了摆放美观,每一层至多摆放两个商品,而且商品的总长度不能比货架长度长(已知单个商品的长度都不会比货架长) 请问至少需要多少层的货架,才能漂亮的摆放这些商品呢?
输入描述:
共两行 第一行为一个整数,表示货架的长度X 第二行为一组整数数组,由空格分割,数组中的值表示商品的长度
输出描述:
仅一行一个整数表示答案,即最少需要的货架层数
输入例子1:
3
1 2
输出例子1:
1
例子说明1:
(1,2)摆放在同一层货架即可
输入例子2:
3
3 3 2 2 1
输出例子2:
4
例子说明2:
(3)(3)(2,1)(2) 四层货架摆放
同样的题了 本题的枚举顺序就是:
对于每个商品 放在已有的货架 or 新开一个货架
这里DFS的剪枝:
- 优化搜索顺序 优先搜索分支较少的节点:排序 从大到小搜索
- 可行性剪枝 如果超过货架长度直接跳过
- 最优性剪枝 如果当前的方案比已经搜到的最优解的货架数还多 直接返回
判题的答案有问题
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <sstream>
using namespace std;
int n, m, ans; // n 数字个数 m 货架长度
vector<int> w, sum;
void dfs(int u, int k)
{
// 最优性剪枝
if(k >= ans) return;
if(u == n)
{
ans = k;
return;
}
// 1. 加入已有的货架中
for(int i = 0; i < k; i++)
{
if(sum[i] + w[u] <= m)
{
sum[i] += w[u];
dfs(u + 1, k);
sum[i] -= w[u];
}
}
// 2. 创建新的货架
sum[k] += w[u];
dfs(u + 1, k + 1);
sum[k] -= w[u];
}
int main()
{
scanf("%d\n", &m);
int x;
while(cin >> x)
w.push_back(x);
n = w.size();
sum = vector<int>(n + 1, 0);
// 排序
sort(w.begin(), w.end(), greater<int>());
ans = n;
dfs(0, 0);
printf("%d\n", ans);
return 0;
}
和谐连续序列是指一个连续序列中元素的最大值和最小值之间的差值正好是1。 现在,给定一个整数数组,你需要在所有可能的连续子序列中找到最长的和谐连续子序列的长度。
输入描述:
一行整数数组,由空格分割
输出描述:
一行一个数字表示答案,即最长和谐连续子序列的长度
输入例子1:
1 3 2 2 5 2 3 7
输出例子1:
3
例子说明1:
最长的连续和谐子序列是:
[3,2,2]
输入例子2:
1 3 2 2 1 1 2 3
输出例子2:
5
例子说明2:
最长的连续和谐子序列是:
[2,2,1,1,2]
之前看见最长连续子序列就以为是动态规划 但这题是滑动窗口中的不规定长度滑动窗口
指路Leetcode 76. 最小覆盖子串中滑动窗口的解法
这里为了知道滑动窗口中的最大值*s.rbegin()
和最小值*s.begin()
这里用multiset维护滑动窗口内的元素
注意这里的删除是先find再删除 不然所有值一样的元素都删没了
我也不知道为什么我本机调试while(cin >> x)
就是读不进来 不懂
#include <iostream>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <vector>
#include <set>
using namespace std;
int n;
vector<int> nums;
int main()
{
int x, res = 0;
string line;
getline(cin, line);
stringstream ss(line);
while(ss >> x)
{
nums.push_back(x);
}
n = nums.size();
// 怎么感觉是 滑动窗口了
multiset<int> s;
for(int l = 0, r = 0; r < n; r++)
{
// 加入滑动窗口
s.insert(nums[r]);
if(*s.begin() == *s.rbegin()) continue;
while(l < r && *s.begin() + 1 != *s.rbegin())
s.erase(s.find(nums[l++]));
if(*s.begin() + 1 == *s.rbegin())
res = max(res, r - l + 1);
}
cout << res << endl;
return 0;
}