【AcWing】第60场周赛

文章目录

  • 前言
  • 4494. 吃饭
    • 题目描述
    • 输入格式
    • 输出格式
    • 数据范围
    • 输入输出样例
    • 解题思路
    • AC代码
  • 4495. 数组操作
    • 题目描述
    • 输入格式
    • 输出格式
    • 数据范围
    • 输入输出样例
    • 解题思路
    • AC代码
  • 4496. 吃水果
    • 题目描述
    • 输入格式
    • 输出格式
    • 数据范围
    • 输入输出样例
    • 解题思路
    • AC代码
  • 总结


前言

第一次报名AcWing周赛,最后却忘记了,后来才来做的。


4494. 吃饭


4494. 吃饭

题目描述

n 个小朋友去食堂吃饭,食堂一共准备了 m 份饭和 k 瓶饮料。

请问,能否让每个小朋友都分到至少一份饭和一瓶饮料?


输入格式

第一行包含三个整数 n,m,k。

输出格式

如果可以让每个小朋友都分到至少一份饭和一瓶饮料,则输出 Yes,否则输出 No。

数据范围

所有测试点满足 1 ≤ n,m,k ≤ 100。


输入输出样例

示例1

输入:5 8 6
输出:Yes

示例2

输入:3 9 3
输出:Yes

示例3

输入:8 5 20
输出:No

解题思路

饭和饮料同时大于小朋友个数。


AC代码

#include 
using namespace std;
int n, m, k;
int main() {
    scanf("%d %d %d", &n, &m, &k); // 输入数据
    if (n <= m && n <=k) printf("Yes"); // 判断饭和饮料同时大于小朋友个数
    else printf("No");
    return 0;
}

4495. 数组操作


4495. 数组操作

题目描述

给定一个长度为 n 的正整数数组 a1,a2,…,an。

请你对该数组进行 k 次操作,每次操作具体如下:

1、如果数组中存在非零元素,则找到其中的最小非零元素 x,将其输出,并让数组中的所有非零元素都减去 x。
2、如果数组中不存在非零元素,则输出 0 即可。


输入格式

第一行包含两个整数 n,k。

第二行包含 n 个整数 a1,a2,…,an。

输出格式

共 k 行,其中第 i 行输出第 i 次操作需要输出的值。

数据范围

前四个测试点满足 1 ≤ n ≤ 10。
所有测试点满足 1 ≤ n,k ≤ 105,1 ≤ ai ≤ 109


输入输出样例

示例1

输入:
3 5
1 2 3
输出:
1
1
1
0
0

示例2

输入:
4 2
10 3 5 3
输出:
3
2

解题思路

原始数据放数组a,对数组a进行排序,找规律发现当前这个数输出时等于当前这个数减去前一个数,即a[i]-a[i-1]。为了便于理解以及编写代码,用数组b去装要输出的数,即b[i]=a[i]-a[i-1],依次输出,若输出完了就输出0。


AC代码

#include 
using namespace std;
const int N = 1e5 + 10;
int n, k, a[N], b[N];

void quick_sort(int q[], int l, int r) {
    if (l >= r) return;
    int i = l - 1, j = r + 1, x = q[l + r >> 1];
    while (i < j) {
        do i ++; while (q[i] < x);
        do j --; while (q[j] > x);
        if (i < j) swap(q[i], q[j]);
    }
    quick_sort(q, l, j), quick_sort(q, j + 1, r);
}

int main() {
    scanf("%d %d", &n, &k);
    for (int i = 0; i < n; i++) scanf("%d", &a[i]); // 输入数组
    quick_sort(a, 0, n - 1); // 快排
    for (int i = 0; i < n; i++) b[i] = a[i] - a[i - 1]; // 
    for (int i = 0; i < n + 1; i ++ ) {
        if (!k) break; // k次操作完就退出
        if (b[i] != 0) { // 当前数值不为0才输出
            printf("%d\n", b[i]);
            k --;
        }
    }
    while (k--) printf("0\n"); // 如果数组中不存在非零元素,则输出 0 即可
    return 0;
}

4496. 吃水果


4496. 吃水果

题目描述

n 个小朋友站成一排,等着吃水果。

一共有 m 种水果,每种水果的数量都足够多。

现在,要给每个小朋友都发一个水果,要求:在所有小朋友都拿到水果后,恰好有 k 个小朋友拿到的水果和其左边相邻小朋友拿到的水果不同(最左边的小朋友当然不算数,即最左边的小朋友不包含在 k 个小朋友内)。

请你计算,一共有多少种不同的分发水果的方案。


输入格式

一行,三个整数 n,m,k。

输出格式

一个整数,表示合理的分发水果的方案总数量对 998244353 取模后的结果。

数据范围

前 5 个测试点满足 1 ≤ n,m ≤ 5。
所有测试点满足 1 ≤ n,m ≤ 2000,0 ≤ k ≤ n−1。


输入输出样例

示例1

输入:
3 3 0
输出:
3

示例2

输入:
3 2 1
输出:
4

解题思路

动态规划问题,根据题目的意思写出状态转移方程。一定要用long long来装!


AC代码

#include 
using namespace std;
const int mod = 998244353; // 取模的值
const int N = 2010; // 所有测试点满足 1 ≤ n,m ≤ 2000
long long int dp[N][N]; // 定义动态规划数组
long long int n, m, k;
void solve() {
    // 初始化dp数组
    for (int i = 1; i <= k; i++) dp[1][i] = 0;
    for (int i = 1; i <= n; i++) dp[i][0] = m;
    // 状态转移
    for (int i = 2; i <= n; i++)
        for(int j = 1; j <= k; j++)
            dp[i][j] = (dp[i - 1][j] + dp[i - 1][j - 1] * (m - 1) % mod) % mod;
    // 输出结果
    printf("%lld", dp[n][k]);
}

int main() {
    scanf("%lld %lld %lld", &n, &m, &k);
    solve();
    return 0;
}

总结

第一题签到题,
第二题可以用快排可以用sort,
第三题看了大佬的题解才把代码写出来的,然而并没有完全理解,但是一定要用long long!!!

你可能感兴趣的