2022/7/16 周赛

A:AcWing 4494. 吃饭

关键词:

签到题

题意:

签到题

思路:

判断b,c是否大于a

AC代码:

#include <iostream>
using namespace std;

int main()
{

    int a, b, c;
    cin >> a >> b >> c;

    if (b >= a && c >= a)   cout << "Yes" << endl;
    else
        cout << "No" << endl;
}



B:AcWing 4495. 数组操作

关键词:

差分

题意:

给定一个长度为 n 的正整数数组 a1,a2,…,an。
请你对该数组进行 k 次操作,每次操作具体如下:

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

思路:

找到规律,每次要输出的那个数为 a[i] - a[i-1],即将差分数组输出即可
在这里插入图片描述

AC代码:

#include <iostream>
#include <algorithm>
#include <cstring>

using namespace std;

const int N = 1e5 + 5;

int n, k;
int w[N];

int main()
{
    cin >> n >> k;
    for (int i = 1; i <= n; i ++)   cin >> w[i];
    sort(w + 1, w + 1 + n);
    
    n = unique(w + 1, w + 1 + n) - (w + 1);
    
    for (int i = 1; i <= k; i ++)
        if (i <= n) cout << w[i] - w[i - 1] << endl;
        else
            cout << 0 << endl;
    
    return 0;
}



C:AcWing 4496. 吃水果

关键词:

动态规划

题意:

n个小朋友,m种水果,满足有k个小朋友与他左边小朋友的水果不一样

思路:

闫氏DP分析法,集合f[i,j]表示前 i 个小朋友恰好有 j 个小朋友与左边的小朋友水果不一样,状态计算:

  • 当 i 与左边不同时, 前i - 1个小朋友恰有j - 1个不同即符合f[i - 1, j - 1],对于第 i 个小朋友的苹果,只需要和i - 1不同即可,所以有m种选法,要乘m
  • 当 i 与左边相同时,前i - 1个小朋友恰有 j 个不同即符合f[i - 1, j],对于第i个小朋友的水果,只能和第i - 1个小朋友相同,所以只有一种选法
    判断b,c是否大于a

AC代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 2005, MOD = 998244353;

int f[N][N];
int n, m, k;

int main()
{
    cin.tie(0), cout.tie(0);
    ios::sync_with_stdio(false);
    cin >> n >> m >> k;
    
    f[1][0] = m;    // 1 个小朋友,恰有 0 个和左边不一样 选法为 m
    for (int i = 2; i <= n; i ++)   // 共有 i 个小朋友
        for (int j = 0; j <= k && j <= i; j ++)     // 恰有 k 个小朋友与左边不一样
        {
            f[i][j] = f[i - 1][j];
            if (j >= 1) f[i][j] = (f[i][j] + f[i - 1][j - 1] * (m - 1ll))% MOD; 
        }
    
    cout << f[n][k] << endl;
    return 0;
}



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值