1、全排列函數的使用
舉例:{1,2,3}的全排列
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){ll a[3] = {1, 2, 3};do{for (ll i = 0; i < 3;i++){cout << a[i] << " ";}cout << endl;} while (next_permutation(a, a + 3));
}
2、算法題應用
B-小苯購物_牛客周賽 Round 94
題目描述:?給我們3個優惠券,每個優惠券存在兩個參數a,b。表示只有商品價格大于a元的時候我們才可以優惠b元。每種商品我們可以選或者不選。給出一開始商品的價格n,問最終n的最小值為多少?
本題思路:
- b都是大于0的,如果可以選擇優惠我們選就比不選好。
- 但是這樣就會存在一些問題,選擇優惠之后可能商品的價格會變低,影響后面商品優惠的選擇,說明這個又和優惠券的選擇順序有關。
- 本題只存在3個優惠券,我們枚舉出所有選擇的全排列進行依次比較即可,這樣以來我們就可以考慮到所有的選擇情況了。
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n; // 商品初始價格
ll a[3], b[3]; // 三個優惠券的參數,a[i]表示優惠閾值,b[i]表示優惠金額
// 函數f,用于計算在特定優惠券選擇順序下的最終價格
ll f(ll i, ll j, ll k) {ll m = n; // 初始化當前價格為初始價格n// 檢查第一個優惠券是否可用,如果可用則應用優惠if (a[i] <= m) m -= b[i];// 檢查第二個優惠券是否可用,如果可用則應用優惠if (a[j] <= m) m -= b[j];// 檢查第三個優惠券是否可用,如果可用則應用優惠if (a[k] <= m) m -= b[k];// 如果最終價格小于0,則設置為0if (m < 0) m = 0;return m; // 返回最終價格
}
void solve() {cin >> n; // 讀取商品初始價格n// 讀取三個優惠券的參數for (ll i = 0; i < 3; i++) {cin >> a[i] >> b[i];}ll mx = n; // 初始化最小價格為初始價格nll c[3] = {0, 1, 2}; // 優惠券選擇順序的初始排列// 遍歷所有可能的優惠券選擇順序do {ll v = f(c[0], c[1], c[2]); // 計算當前順序下的最終價格// 如果當前最終價格小于當前最小價格,則更新最小價格if (v < mx) {mx = v;}} while (next_permutation(c, c + 3)); // 生成下一個排列cout << mx << endl; // 輸出最小價格
}
int main() {ll t;cin >> t;while (t--) { solve(); }
}