本文主要是介绍题目2693:蓝桥杯2022年第十三届决赛真题-卡牌【排序模拟法图解】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
😎卡牌
这道题是最近难得独立想出来的一道题目,从题目到代码没有看过题解, 全是自己的思路
🥰自制动画–过程演示
🤔大致思路
-
定义每个卡牌为结构体
-
struct card {int a;int b; };
有两个属性,
a
表示该卡牌的数量,b
表示空卡牌使用次数上限。 -
根据规律,我们先将所有卡牌按照
a
的值进行排序: -
sort(cards.begin(), cards.end(), [&](card x, card y)->bool{return x.a < y.a;});
我们用存放
card
类型的动态数组cards
来存放所有的卡牌结构体 -
根据题目所给定的条件,我们只有
m
个的空卡牌,也就是我们总共只能对卡牌增加m
次
所以我们使用一个大循环,次数为m
次,每次都只兑换数量最少的卡牌, 也就是a
属性最小的卡牌,兑换完后,被兑换的卡牌的可以被增加的机会就会少一次,那么card.b--
。类似于木桶效益,最少的卡牌数量决定
了一套卡牌的数量,所以一旦有一个卡牌次数用完了,直接结束即可。
同时,如果卡牌数量加一后,不再是最小的卡牌,要将这个卡牌放到对应的位置上去,方便下次继续处理最小的卡牌。
⌨️代码
#include <iostream>
#include <vector>
#include <algorithm>
#define int long long
using namespace std;struct card {int a;int b;
};signed main() {ios::sync_with_stdio(false);cin.tie(0);int n, m;cin >> n >> m;vector<card> cards(n);for (int i = 0; i < n; i++) {cin >> cards[i].a;}for (int i = 0; i < n; i++) {cin >> cards[i].b;}sort(cards.begin(), cards.end(), [&](card x, card y) -> bool {return x.a < y.a ;});while(m--) {card &c = cards[0]; //遍历所有的卡片 if (c.b > 0) {c.a ++, c.b --;int i = 0;while(cards[i].a > cards[i+1].a) {swap(cards[i], cards[i+1]);i += 1;}} else {break;}}cout << cards[0].a << endl;}
这篇关于题目2693:蓝桥杯2022年第十三届决赛真题-卡牌【排序模拟法图解】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!