7-39 魔法优惠券 (25 分)(思路加解释 用容器做的)加油兄弟们
一:題目
在火星上有個魔法商店,提供魔法優惠券。每個優惠劵上印有一個整數面值K,表示若你在購買某商品時使用這張優惠劵,可以得到K倍該商品價值的回報!該商店還免費贈送一些有價值的商品,但是如果你在領取免費贈品的時候使用面值為正的優惠劵,則必須倒貼給商店K倍該商品價值的金額…… 但是不要緊,還有面值為負的優惠劵可以用!(真是神奇的火星)
例如,給定一組優惠劵,面值分別為1、2、4、-1;對應一組商品,價值為火星幣M7、6、?2、?3,其中負的價值表示該商品是免費贈品。我們可以將優惠劵3用在商品1上,得到M28的回報;優惠劵2用在商品2上,得到M12的回報;優惠劵4用在商品4上,得到M3的回報。但是如果一不小心把優惠劵3用在商品4上,你必須倒貼給商店M12。同樣,當你一不小心把優惠劵4用在商品1上,你必須倒貼給商店M7。
規定每張優惠券和每件商品都只能最多被使用一次,求你可以得到的最大回報。
輸入格式:
輸入有兩行。第一行首先給出優惠劵的個數N,隨后給出N個優惠劵的整數面值。第二行首先給出商品的個數M,隨后給出M個商品的整數價值。N和M在[1, 10
6
]之間,所有的數據大小不超過2
30
,數字間以空格分隔。
輸出格式:
輸出可以得到的最大回報。
輸入樣例:
4 1 2 4 -1 4 7 6 -2 -3輸出樣例:
43二:思路
這個是用vector容器做的,在處理數據時,我是將正數和負數分開處理了,所以就簡單多了
如果兄弟們對vector這個特好用的容器不了解的話,可以點鏈接學習下哈
vector的基本用法
三:上碼
#include<bits/stdc++.h> using namespace std;int main(){int N,M;vector<int>v1,v2,v3,v4; //v1,v3處理正數,v2,v4處理負數 int sum = 0; cin >> N;for( int i = 0; i < N; i++ ){int temp;cin >> temp;if(temp > 0) v1.push_back(temp);elsev2.push_back(temp);}cin >> M;for( int i = 0; i < M; i++ ){int temp;cin >> temp;if( temp > 0) v3.push_back(temp);elsev4.push_back(temp);}sort(v1.begin(),v1.end());sort(v2.begin(),v2.end());sort(v3.begin(),v3.end());sort(v4.begin(),v4.end());while(!v1.empty() && !v3.empty()){int a = v1.back();int b = v3.back();sum += a * b;v1.pop_back();v3.pop_back();}int K = v2.size() < v4.size()? v2.size():v4.size();for( int i = 0; i < K; i++ ){sum += v2[i] * v4[i]; }cout << sum;}//4 1 2 4 -1 //3 7 6 -2總結
以上是生活随笔為你收集整理的7-39 魔法优惠券 (25 分)(思路加解释 用容器做的)加油兄弟们的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 闲置的平板别扔,软硬兼施变超级本
- 下一篇: 7-40 奥运排行榜 (25 分)(详解