1037 Magic Coupon
The magic shop in Mars is offering some magic coupons. Each coupon has an integer N printed on it, meaning that when you use this coupon with a product, you may get N times the value of that product back! What is more, the shop also offers some bonus product for free. However, if you apply a coupon with a positive N to this bonus product, you will have to pay the shop N times the value of the bonus product... but hey, magically, they have some coupons with negative N's!
For example, given a set of coupons { 1 2 4 −1 }, and a set of product values { 7 6 −2 −3 } (in Mars dollars M$) where a negative value corresponds to a bonus product. You can apply coupon 3 (with N being 4) to product 1 (with value M$7) to get M$28 back; coupon 2 to product 2 to get M$12 back; and coupon 4 to product 4 to get M$3 back. On the other hand, if you apply coupon 3 to product 4, you will have to pay M$12 to the shop.
Each coupon and each product may be selected at most once. Your task is to get as much money back as possible.
Each input file contains one test case. For each case, the first line contains the number of coupons NC, followed by a line with NC coupon integers. Then the next line contains the number of products NP, followed by a line with NP product values. Here 1≤NC,NP≤105, and it is guaranteed that all the numbers will not exceed 230.
For each test case, simply print in a line the maximum amount of money you can get back.
- 4
- 1 2 4 -1
- 4
- 7 6 -2 -3
43
总结:这次两道题目都挺简单的,没啥难度,不知道为什么还有一个测试点没有通过(还未找到,未设置重复使用数字的情况)
思路:排完序后,找符号相同的相乘
因为题目要求我们求出最大值,所以最大的正数和最大的正数相乘,依次接下去,直到遇到一正一负的情况结束循环,最小的负数和最小的负数相乘(可以到达最大的正数),依次接下去,直到遇到一正一负的情况
使用vector数组a,b存储两组数 ,sort排序后开始遍历循环
代码:
- #include
- #include
- #include
- using namespace std;
-
- int main(){
- int n,t;
- long long sum=0;
- vector<int> a,b;
- cin >> n;
-
- for(int i=0;i
- scanf("%d",&t);
- a.push_back(t);
- }
- sort(a.begin(),a.end());
-
- cin >> n;
- for(int i=0;i
- scanf("%d",&t);
- b.push_back(t);
- }
- sort(b.begin(),b.end());
-
- bool sign=false;
- for(int i=0,j=0;i
size() && jsize();i++,j++){ - if(a[i]*b[i]<0){
- sign=true;
- break;
- }
- sum+=a[i]*b[j];
- }
-
- if(sign){
- for(int i=a.size()-1,j=b.size()-1;i>=0 && j>=0;i--,j--){
- if(a[i]*b[i]<0) break;
- sum+=a[i]*b[i];
- }
- }
- printf("%lld\n",sum);
-
- return 0;
- }
大佬的代码:
思路:排序完后,先找都是负数的相乘,再找都是正数的相乘
- #include
- #include
- #include
- using namespace std;
- int main() {
- int m, n, ans = 0, p = 0, q = 0;
- scanf("%d", &m);
- vector<int> v1(m);
- for(int i = 0; i < m; i++)
- scanf("%d", &v1[i]);
- scanf("%d", &n);
- vector<int> v2(n);
- for(int i = 0; i < n; i++)
- scanf("%d", &v2[i]);
- sort(v1.begin(), v1.end());
- sort(v2.begin(), v2.end());
- while(p < m && q < n && v1[p] < 0 && v2[q] < 0) {
- ans += v1[p] * v2[q];
- p++; q++;
- }
- p = m - 1, q = n - 1;
- while(p >= 0 && q >= 0 && v1[p] > 0 && v2[q] > 0) {
- ans += v1[p] * v2[q];
- p--; q--;
- }
- printf("%d", ans);
- return 0;
- }
好好学习,天天向上!
我要考研!
2022.11.4
- /*
- 思路:这道题目实质上就是匹配数字,将数字匹配然后相乘(且每个值数字只能使用一次),结果最大
- 先排序,因为是从小到大排序的,所以需要先从尾巴开始循环,这样能先使用最大的值相乘,结果最大
- 如果中间两个数字符号不一样(a[i]*b[i]<0),则结束循环,然后再从头开始循环,未使用过的且
- 符号相同
- */
- #include
- #include
- using namespace std;
-
- int main(){
- int n,m;
- scanf("%d",&n);
- int a[n];
- for(int i=0;i
scanf("%d",&a[i]); - scanf("%d",&m);
- int b[m];
- for(int i=0;i
scanf("%d",&b[i]); -
- int sum=0;
- sort(a,a+n);
- sort(b,b+m);
- int i,j;
- for(i=n-1,j=m-1;i>=0 && j>=0 && a[i]*b[j]>0;i--,j--)
- sum+=a[i]*b[j];
- int q=i,t=j;
- for(i=0,j=0;i
0;i++,j++)
- sum+=a[i]*b[j];
-
- printf("%d\n",sum);
- return 0;
- }
-
相关阅读:
强缓存和协商缓存
《Principles of Model Checking》Chapter 5 Linear Temporal Logic
每日三题 6.28
日本冲绳科学技术研究所启动新量子技术中心OQT
为树莓派打实时preempt_rt补丁
系统设计 | 限流算法及其周边
Dijkstra算法不能解决负权边的问题
学信息系统项目管理师第4版系列35_补遗
Hadoop MapReduce 2.x 工作原理
docker镜像拉取失败,K8s的calicoPod出现Init:ImagePullBackOff问题的解决
-
原文地址:https://blog.csdn.net/weixin_50679551/article/details/126937754