HDU 5504:GT and sequence
GT and sequence
Accepts: 95
Submissions: 1467
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
给出N个整数。你要选择至少一个数,使得你选的数的乘积最大。 保证任意选一些数相乘的绝对值都不会大于263−1。
输入描述
第一行读入一个数T表示数据组数。 对于每组数据: 第一行是一个数N,第二行是N个整数。 1≤T≤1000 1≤N≤62 hack时建议输出最后一行的行末回车;每一行的结尾不要输出空格。
输出描述
对于每组数据,输出一个数表示最大的乘积。
输入样例
1 3 1 2 3
输出样例
6
比的时候本来打算写一个刚学的深搜,结果最后TLE了。。。。
TLE代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #pragma warning(disable:4996) using namespace std; int test; long long n, a[70], ans, flag; void dfs(long long i, long long mul) { if (i == n + 1) { if (flag == 0 && mul == 1) { flag = 1; } else { ans = max(ans, mul); } return; } dfs(i + 1, mul); dfs(i + 1, mul*a[i]); } int main() { //freopen("i.txt", "r", stdin); //freopen("o.txt", "w", stdout); int i; scanf("%d", &test); while (test--) { flag = 0; scanf("%I64d", &n); i = 1; for (i = 1; i <= n; i++) scanf("%I64d", &a[i]); sort(a + 1, a + n + 1); ans = a[n]; dfs(1, 1); cout << ans << endl; } //system("pause"); return 0; }
最后规规矩矩考虑各种情况,很麻烦的一道题。。。。负数是奇数个的时候不要最大的那个。。。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <ctime> #pragma warning(disable:4996) using namespace std; long long po[900], ne[900]; long long n, num_ne, num_po; bool cmp(long long x, long long y) { return x > y; } int main() { long long test, flag0, i, x, ans; scanf("%I64d", &test); while (test--) { num_ne = 0; num_po = 0; flag0 = 0; memset(po, 0, sizeof(po)); memset(ne, 0, sizeof(ne)); scanf("%I64d", &n); for (i = 1; i <= n; i++) { scanf("%I64d", &x); if (x > 0) { po[num_po++] = x; } else if (x < 0) { ne[num_ne++] = x; } else { flag0 = 1; } } sort(po, po + num_po); sort(ne, ne + num_ne,cmp); if (flag0) { if (num_po > 0) { ans = 1; for (i = 0; i < num_po; i++) { ans = ans*po[i]; } if (num_ne % 2) { for (i = 1; i < num_ne; i++) { ans = ans*ne[i]; } } else { for (i = 0; i < num_ne; i++) { ans = ans*ne[i]; } } } else { //没有正数的情况 if (num_ne == 0) { ans = 0; } else if (num_ne == 1) { ans = 0; } else { ans = 1; if (num_ne % 2) { for (i = 1; i < num_ne; i++) { ans = ans*ne[i]; } } else { for (i = 0; i < num_ne; i++) { ans = ans*ne[i]; } } } } } else { if (num_po > 0) { ans = 1; for (i = 0; i < num_po; i++) { ans = ans*po[i]; } if (num_ne % 2) { for (i = 1; i < num_ne; i++) { ans = ans*ne[i]; } } else { for (i = 0; i < num_ne; i++) { ans = ans*ne[i]; } } } else { //没有正数的情况 if (num_ne == 0) { ans = 0; } else if (num_ne == 1) { ans = ne[0]; } else { ans = 1; if (num_ne % 2) { for (i = 1; i < num_ne; i++) { ans = ans*ne[i]; } } else { for (i = 0; i < num_ne; i++) { ans = ans*ne[i]; } } } } } cout << ans << endl; } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。