暴力模拟的,因为本人是突击的菜鸡,所以只打算省三就行,今天一次写出了这道简单题,还是很高兴的,虽然没有全国,但是过了大部分,代码如下,有些测试点没过,请各位帮忙看一下代码模拟的问题;
题目描述
这天,小明在整理他的卡牌。
他一共有 n 种卡牌,第 i 种卡牌上印有正整数数 i(i ∈ [1, n]),且第 i 种卡牌 现有 ai 张。
而如果有 n 张卡牌,其中每种卡牌各一张,那么这 n 张卡牌可以被称为一 套牌。小明为了凑出尽可能多套牌,拿出了 m 张空白牌,他可以在上面写上数 i,将其当做第 i 种牌来凑出套牌。然而小明觉得手写的牌不太美观,决定第 i 种牌最多手写 bi 张。
请问小明最多能凑出多少套牌?
输入格式
输入共 3 行,第一行为两个正整数 n, m。
第二行为 n 个正整数 a1, a2, ..., an。
第三行为 n 个正整数 b1, b2, ..., bn。
输出格式
一行,一个整数表示答案。
代码:
#include<stdio.h>
#define MAX 200001
int a[MAX];//原有数量
int b[MAX];//可增加数量
int visit[MAX];
int match(int a[], int b[], int n) {
int need = 0;
for (int i = 1; i <= n; i++) {
if (a[i] > 0) {
a[i]--;
}
else if (b[i] > 0) {
b[i]--;
need++;
}
else {
return n + 1;//当need=n+1时,结束配牌
}
}
return need;
}
int main() {
int n, m;//m总共可以增加的数量
int need = 0;
int count = 0;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
if (a[i] == 0) {
need++;
}
}
for (int i = 1; i <= n; i++) {
scanf("%d", &b[i]);
visit[i] = 0;
}
while (1) {
need = match(a, b, n);
if (need == (n + 1)) {
break;
}
if (need <= m) {
m -= need;
count++;
}
else {
break;
}
}
printf("%d", count);
return 0;
}