1037 Magic Coupon (25 point(s))
原题链接
一开始代码写成这个样子
#include<stdio.h>
#include<iostream>
#include<algorithm>
bool cmp(int a, int b) {
return a > b;
}
using namespace std;
int main() {
int coupon = 0;
int conduct = 0;
int value = 0;
int temp = 0;
int cp[100010] = { 0 };
int cd[100010] = { 0 };
cin >> coupon;
for (int i = 0; i < coupon; i++)
scanf("%d", &cp[i]);
cin >> conduct;
for (int i = 0; i < conduct; i++)
scanf("%d", &cd[i]);
sort(cp, cp + coupon, cmp);
sort(cd, cd + conduct, cmp);
temp = min(coupon, conduct);
for (int i = 0; i < temp; i++)
if (cp[i] >= 0 && cd[i] >= 0)
value += cp[i] * cd[i];
else
break;
for (int i = temp - 1; i >= 0; i--)
if (cp[i] <= 0 && cd[i] <= 0)//出错点,两组数据的多少不一定匹配
value += cp[i] * cd[i];
else
break;
cout << value;
return 0;
}
一开始怎么看都看不出来,总觉得两个循环就是前者从头开始,后者就是从后面开始。后来再仔细看了好久才发现,第二个并不一定从数据末开始循环,两组数据有可能不匹配。是一个非常简单的错误。
下面给出正确代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
bool cmp(int a, int b) {
return a > b;
}
using namespace std;
int main() {
int coupon = 0;
int conduct = 0;
int value = 0;
int temp = 0;
int cp[100010] = { 0 };
int cd[100010] = { 0 };
cin >> coupon;
for (int i = 0; i < coupon; i++)
scanf("%d", &cp[i]);
cin >> conduct;
for (int i = 0; i < conduct; i++)
scanf("%d", &cd[i]);
sort(cp, cp + coupon, cmp);
sort(cd, cd + conduct, cmp);
temp = min(coupon, conduct);
for (int i = 0; i < temp; i++)
if (cp[i] > 0 && cd[i] > 0)
value += cp[i] * cd[i];
else
break;
for (int i = 1; i <= temp; i++)
if (cp[coupon - i] < 0 && cd[conduct - i] < 0)
value += cp[coupon - i] * cd[conduct - i];
else
break;
cout << value;
return 0;
}