Backjoon Greedy 1744カウント
3046 ワード
これはかなり簡単な問題だと直感的に思っていたが、3回間違えた.
負の値は小さい値からソートされます(セクション値が大きいため)
数量は大きい値から並べ替えられます.
そして、正数=n、この高負数の個数=mのとき
nが偶数なら)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-2] x v[n-1]
n奇数の場合)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-3] x v[n-2] + v[n-1]
mが偶数なら)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-2] x v[n-1]
n奇数の場合)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-3] x v[n-2] + v[n-1]
ここで最初のエラーが発生しました.
mが奇数の場合、最小終端値を有するv[n−1]は負数であるため、加算は損失である.
既存の数列に0がある場合は、負の値を追加する必要はありません.
ゼロがあるかどうかをチェックします.
2つ目の間違いは考えても思いつかないので、ネットで調べてみました.
1 1 1 1 1を入力すると
1+1+1+1は(1 x 1)+(1 x 1)より大きい.
1正数列を選ぶときは選ばず、個数だけチェックし、最後にもう一度加算することにします.
負の値は小さい値からソートされます(セクション値が大きいため)
数量は大きい値から並べ替えられます.
そして、正数=n、この高負数の個数=mのとき
nが偶数なら)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-2] x v[n-1]
n奇数の場合)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-3] x v[n-2] + v[n-1]
mが偶数なら)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-2] x v[n-1]
n奇数の場合)
sum += V[0] x V[1] + V[2] x v[3] + · · · + v[n-3] x v[n-2] + v[n-1]
ここで最初のエラーが発生しました.
mが奇数の場合、最小終端値を有するv[n−1]は負数であるため、加算は損失である.
既存の数列に0がある場合は、負の値を追加する必要はありません.
ゼロがあるかどうかをチェックします.
2つ目の間違いは考えても思いつかないので、ネットで調べてみました.
1 1 1 1 1を入力すると
1+1+1+1は(1 x 1)+(1 x 1)より大きい.
1正数列を選ぶときは選ばず、個数だけチェックし、最後にもう一度加算することにします.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) { return a > b; }
bool cmp1(int a, int b) { return a < b; }
int main()
{
int n;
int sum = 0;
int zero_flag = 0;
int one_cnt = 0;
vector<int> seq;
vector<int> seq_pos;
vector<int> seq_neg;
cin >> n;
while (n--)
{
int s;
cin >> s;
seq.push_back(s);
}
sort(seq.begin(), seq.end(),cmp);
for (int i = 0; i < seq.size(); i++)
{
if (seq[i] > 1) seq_pos.push_back(seq[i]);
else if (seq[i] < 0) seq_neg.push_back(seq[i]);
else if (seq[i] == 0) zero_flag = 1; // 1차오류
else if (seq[i] == 1) one_cnt++; // 2차오류
}
sort(seq_neg.begin(), seq_neg.end(), cmp1);
if (seq_pos.size() % 2 == 0)
{
for (long unsigned int i = 0; i < seq_pos.size(); i = i + 2)
{
sum += (seq_pos[i] * seq_pos[i + 1]);
}
}
else
{
for (long unsigned int i = 0; i < seq_pos.size()-1; i = i + 2)
{
sum += (seq_pos[i] * seq_pos[i + 1]);
}
sum += seq_pos[seq_pos.size() - 1];
}
if (seq_neg.size() % 2 == 0)
{
for (long unsigned int i = 0; i < seq_neg.size(); i = i + 2)
{
sum += (seq_neg[i] * seq_neg[i + 1]);
}
}
else
{
for (long unsigned int i = 0; i < seq_neg.size() - 1; i = i + 2)
{
sum += (seq_neg[i] * seq_neg[i + 1]);
}
if (!zero_flag) { // 0이 없다면
sum += seq_neg[seq_neg.size() - 1];
}
}
cout << sum+one_cnt;
return 0;
}
Reference
この問題について(Backjoon Greedy 1744カウント), 我々は、より多くの情報をここで見つけました https://velog.io/@soonyubi/Backjoon그리디1744수-묶기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol