C++U4-第12课-阶段测评练习

一、选择题

1

 2

 3

 4

 5

 6

 7

 8

 9

 10

 11

 12

 二、编程题

 

 

【算法分析】
如果第 i 个人是第 i−1 和 i+1 中评分最高的,那么他的糖果数是这三个人当中最多的,由于要准备糖果数目最小,因此第 i 个人的糖果数是 i−1 人的糖果数和 i+1 人的糖果数的最大值 +1。现在我们只考虑每个人的左边(右边同理),分析题目可以发现,每个人得到的糖果数的值是他处于单调递增序列的第几个。

【参考代码】
#include<bits/stdc++.h>
using namespace std;

int n, ans;
int s[10005], l[10005], r[10005];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &s[i]);
        l[i] = r[i] = 1;
    }
    for (int i = 2; i <= n; i++) {
        if (s[i] > s[i - 1]) {
            l[i] = l[i - 1] + 1;
        }
    }
    for (int i = n - 1; i >= 1; i--) {
        if (s[i] > s[i + 1]) {
            r[i] = r[i + 1] + 1;
        }
    }
    for (int i = 1; i <= n; i++) {
        ans += max(l[i], r[i]);
    }
    printf("%d\n", ans);
    return 0;
}
View Code

 

2

 

3、

 二分答案做://单调性:就是满足条件的越多,能邀请的就越多;反之则越少

//单调性:就是满足条件的越多,能邀请的就越多;反之则越少
#include<bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 9;
int a[maxn], b[maxn];
int n;

// 检查是否存在一种安排方式,满足条件
bool check(int mid) {
    int now = 1;    //满足条件的人数    至少有一个人参加聚会    now实际上是在考虑参与度小于 i 且符合题目要求的人数


    // 从第一个朋友开始检查
    for (int i = 1; i <= n; i++) {
        // 如果该朋友满足条件,则增加当前已确定满足条件的人数
        if (b[i] >= now - 1 && a[i] >= mid - now) now++;      //now-1是去的当前的朋友自己   mid-now  是总体答案人数减去 
    }

    // 返回是否已经满足条件的人数超过 mid
    return now > mid;
}

int main() {
    // 读入朋友的数量
    cin >> n;

    // 读入每个朋友的 ai 和 bi
    for (int i = 1; i <= n; i++) {
        cin >> a[i] >> b[i];          //比他活跃的人和不活跃的人数    
    }

    // 初始化二分查找的范围
    int l = 1, r = n, ans;

    // 二分查找
    while (l <= r) {
        // 计算中间值
        int mid = (l + r) >> 1;

        // 检查是否满足条件
        if (check(mid)) {
            // 如果满足条件,更新答案,并调整左边界
            ans = mid;
            l = mid + 1;
        }
        else {
            // 如果不满足条件,调整右边界
            r = mid - 1;
        }
    }

    // 输出最终答案
    cout << ans;
    return 0;
}
View Code

 

 

【算法分析】
二维前缀和的模板题目,注意爆 int。

【参考代码】
#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e3 + 9;
long long sum[maxn][maxn];
int main() {
    int n, m, c;
    cin >> n >> m >> c;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) {
            int x;
            cin >> x;
            sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + x;
        }
    }
    long long ans = -1, ansx, ansy;
    for (int i = c; i <= n; i++) {
        for (int j = c; j <= m; j++) {
            if (sum[i][j] - sum[i - c][j] - sum[i][j - c] + sum[i - c][j - c] > ans) {
                ans = sum[i][j] - sum[i - c][j] - sum[i][j - c] + sum[i - c][j - c];
                ansx = i, ansy = j;
            }
        }
    }
    if (ans == -1) {
        cout << ans;
    }
    else {
        cout << ans << '\n';
        cout << ansx << " " << ansy;
    }
    return 0;
}
View Code

 

本节课作业视频分析

链接:https://pan.baidu.com/s/1wjl8OcqXS-UuZgJW-Vn0gQ?pwd=tfhm
提取码:tfhm

 

U4单元1-12课所有视频分析

链接:https://pan.baidu.com/s/1lnnD8GFCmGVDJgAh6LcPXg?pwd=sacc
提取码:sacc

 

posted @ 2024-01-07 18:17  小虾同学  阅读(7)  评论(0编辑  收藏  举报