版权声明:SupremeBeast3_ https://blog.csdn.net/weixin_43359312/article/details/89047543
1037 Magic Coupon (25 分)
Sample Input:
4
1 2 4 -1
4
7 6 -2 -3
Sample Output:
43
一刷4测试点超时代码
#include <iostream>
#include <cstdio>
using namespace std;
int C[100002], P[100002];
int main() {
int NC, NP;
scanf("%d", &NC);
for (int i = 0; i < NC; i++) scanf("%d", &C[i]);
scanf("%d", &NP);
for (int i = 0; i < NP; i++) scanf("%d", &P[i]);
int Sum = 0;
bool Flag = true;
while (Flag) {
Flag = false;
bool Flag1 = false, Flag2 = false;
int k1 = -1, k2 = -1, ZMax = 1, FMax = -1;
for (int i = 0; i < NC; i++) {
if (C[i] >= ZMax) { Flag1 = true; ZMax = C[i]; k1 = i; }
if (C[i] <= FMax) { Flag1 = true; FMax = C[i]; k2 = i; }
}
if (k1 != -1) C[k1] = 0;
if (k2 != -1) C[k2] = 0;
int CZMax = ZMax, CFMax = FMax;
ZMax = 1, FMax = -1;
int k3 = -1, k4 = -1;
for (int i = 0; i < NP; i++) {
if (P[i] >= ZMax) { Flag2 = true; ZMax = P[i]; k3 = i; }
if (P[i] <= FMax) { Flag2 = true; FMax = P[i]; k4 = i; }
}
if (k3 != -1) P[k3] = 0;
if (k4 != -1) P[k4] = 0;
int PZMax = ZMax, PFMax = FMax;
int Sum1 = 0, Sum2 = 0;
if (k1 != -1 && k3 != -1) Sum1 = CZMax*PZMax;
if (k2 != -1 && k4 != -1) Sum2 = CFMax*PFMax;
if (Flag1 && Flag2) { Sum = Sum + Sum1 + Sum2; Flag = true; }
}
cout << Sum << endl;
return 0;
}
二刷AC代码
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int C[100001], P[100001];
int main() {
int NC, NP;
cin >> NC;
int pos1, pos2; //pos记录C的位置 pos2记录P的位置
for (pos1 = 0; pos1 < NC; pos1++) scanf("%d", &C[pos1]);
cin >> NP;
for (pos2 = 0; pos2 < NP; pos2++) scanf("%d", &P[pos2]);
sort(C, C + NC);
sort(P, P + NP); //对C和P的数从小到大进行排序
int Sum = 0;
for (int i = 0; i < min(NC, NP); i++) {
if (C[i] < 0 && P[i] < 0) Sum += C[i] * P[i];
else break;
} //此循环得到负数的解
while (C[--pos1] > 0 && P[--pos2] > 0) Sum += C[pos1] * P[pos2];
cout << Sum << endl; //此循环得到正数的解
return 0; //正负要分开才能得到最优解 因为C和P的数量不一定匹配
}