首页 > 2020/9/3 19:00 百度笔试
头像
Ember_Sky
编辑于 2020-09-03 21:45
+ 关注

2020/9/3 19:00 百度笔试

//1. 铺地毯

T组样例

L长的数组:初始全为零,n个操作

每个操作将[l,r]闭区间上的数字加一

输出所有操作之后的数组

例如:

1

6 3

1 2

4 5

3 6

1 1 1 2 2 1

暴力直接过

本来还以为要用个分块或者线段树,结果数据真水。

100%代码

typedef long long ll;

int main() {

//ios::sync_with_stdio(false);

//freopen("in.txt", "r", stdin);

int T; cin >> T;

while (T--) {

int L, n; cin >> L >> n;

vector<int>s(L + 10);

while (n--) {

int l, r; cin >> l >> r;

for (int i = l; i <= r; i++) {

s[i]++;

}

}

for (int i = 1; i <= L; i++) {

cout << s[i] << ' ';

}

cout << endl;

}

}

//2.

T组样例

n长的a数组,m长的b数组

a数组的每个元素需要从b数组中找个元素配对

原则:a数组的元素要小于b数组的元素

找不到输出-1

输出:在a数组配对数量最多的情况下,a数组每个元素配对的元素在b数组中的位置(其中一种答案)

例如:

1

3 6

33 66 99

3 6 9 30 60 90

输出:

5 6 -1

思路:

ab数组升序排序,注意保存原始的位置。

排序之后,使用双指针ij分别指向ab数组的最后一个元素

Ifi指向的元素小于等于j指向的元素)说明符合条件

就记录答案

ij分别往前移动一位

else

说明i指向的元素已经没有解了

就让i往前移动一位

typedef long long ll;

struct node {

int val;

int it;

};

bool cmp(node a, node b) {

if (a.val == b.val) {

return a.it < b.it;

}

return a.val < b.val;

}

int main() {

//ios::sync_with_stdio(false);

//freopen("in.txt", "r", stdin);

int T; cin >> T;

while (T--) {

int m, n; cin >> n >> m;

vector<node>a(n);

vector<int>ans(n, -1);

vector<node>b(m);

for (int i = 0; i < n; i++) {

cin >> a[i].val;

a[i].it = i;

}

for (int i = 0; i < m; i++) {

cin >> b[i].val;

b[i].it = i;

}

sort(a.begin(), a.end(), cmp);

sort(b.begin(), b.end(), cmp);

int i = n - 1, j = m - 1;

while (i >= 0 && j >= 0) {

if (a[i].val <= b[j].val) {

ans[a[i].it] = b[j].it + 1;

i--;

j--;

}

else {

i--;

}

}

for (int i = 0; i < n; i++) {

cout << ans[i] << ' ';

}

cout << endl;

}

}

//3.爬楼梯

n个台阶楼梯,一步最少跨一个台阶,最多跨m个台阶

要求:接下来一步跨的台阶数量,不能和之前两步相同

输出移动到n台阶的方案数量。结果对1e9+7取模

例子:

7 3

输出:

2

解释:

{1 2 3 1}{1 3 2 1}

其他情况都不符合要求

思路:

这一看就是dp,正好最近刚学。班门弄斧一下

这是一些题变化过来的

变化过程

第一阶段:完全背包、力扣518零钱兑换

这种题:给定一个数n,和一个数组,求组合成n的方案数量(数组中的每个元素随便使用),他对内部的顺序并不要求,(1 2 3)(1 3 2)算一种方案

第二阶段:力扣377组合总和

这个题:是在前面的基础上,规定不同的顺序是不一样的方案,(1 2 3)(1 3 2)算两种方案

第三阶段:就是这个题了

做这个题之前,可以先做一下力扣377,了解那个题之后,再做这个可能更好一点

dp主要就是想状态和方程

因为必须记录每个方案的最后两步所以想一个三维的状态

dp[a][b][c]:走到第c个台阶,最后两步是ab的方案总数

然后:

遍历nm377的思路)

遍历的时候,遍历ab两个维度,加上符合条件的方案。

80%代码

感觉整体思路是没错的,80可能是因为有些细节(比如初始化)没处理好,没时间改了,写完的时候就剩两分钟了

typedef long long ll;

const int mod = 1e9 + 7;

int f[8][8][100005];

int main() {

//ios::sync_with_stdio(false);

//freopen("in.txt", "r", stdin);

int m, n; cin >> n >> m;

f[0][0][0] = 1;

for (int i = 1; i <= n; i++) {

for (int j = 1; j <= m && j <= i; j++) {

for (int k = 0; k <= m; k++) {

for (int t = 0; t <= m; t++) {

if (k != j && t != j) {

f[t][j][i] += f[k][t][i - j];

f[t][j][i] %= mod;

}

}

}

}

}

ll ans = 0;

for (int i = 1; i <= m; i++) {

for (int j = 1; j <= m; j++) {

ans += f[i][j][n];

ans %= mod;

}

}

cout << ans << endl;

}

全部评论

(0) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐