第一次报名AcWing周赛,最后却忘记了,后来才来做的。
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
饭和饮料同时大于小朋友个数。
#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. 数组操作
给定一个长度为 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。
#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. 吃水果
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来装!
#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!!!