[サムスン148888]挿入演算子
https://www.acmicpc.net/problem/14888
N個のシーケンス N-1個の演算子をN個のシーケンスの間に挿入すると、計算結果の最高値と最高値が検索され、 演算子は、+、-、*、/の順にいくつか与えられます. 計算は優先順位がなく、前から順に行います. 負数/正数を計算すると、円分を求めて負数化します.(除算された数は常に正の値です.)
N<11であるため完全に探索可能と考えられ,これまで計算した値を再帰関数で受け取り,4つの演算子を加えて1回再帰すればよい.
参考までに結果(中間結果を含む)は10万(10^9)でintで解決できます.
が実現するのに時間がかかります^^...最初は、4つの演算子のFOR文を一般的なオーバーラッププロシージャに変換します(中間プロシージャは少し異なります).
それが気に入らなかったのでforを外して1行だけ書いて戻ってきました^^.. 除算実装では,負数/正数,正数/正数ボックスを逆算してどこが間違っているのかわからないので,trakerランベクトルに生成結果の演算子順序を格納し,結果が出たときに撮った.
https://www.acmicpc.net/source/23167877
問題の説明
アイデア
N<11であるため完全に探索可能と考えられ,これまで計算した値を再帰関数で受け取り,4つの演算子を加えて1回再帰すればよい.
参考までに結果(中間結果を含む)は10万(10^9)でintで解決できます.
すくい取る
それが気に入らなかったのでforを外して1行だけ書いて戻ってきました^^..
コード#コード#
https://www.acmicpc.net/source/23167877
#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
vector<int> nums;
int mmin=pow(10,9), mmax=-pow(10,9);//전체 결과중에서
int counter = 0;
void one_proc(int mom_res, int s, vector<int> yeons,vector<int> tracker) {//s는 연산자가 적용될 인덱스
counter++;
if (s == nums.size()) {
/*
cout << "계산결과 비교중" << mmin << " , " << mmax << " , " << mom_res << endl;
for (int i = 0; i < tracker.size(); i++) {
cout << tracker[i] << " ";
}
cout << endl;
*/
mmin = min(mmin, mom_res);
mmax = max(mmax, mom_res);
return;
}
for (int i = 0; i < 4; i++) {
int res = mom_res;
if (yeons[i] <= 0) {
continue;
}
yeons[i]--;
if (i == 0) {
res = res + nums[s];
}
else if (i == 1) {
res = res - nums[s];
}
else if (i == 2) {
res = res * nums[s];
}
else if (i == 3) {
if (res > 0) {
res = res / nums[s];
}
else {
res = -(abs(res) / nums[s]);
}
}
vector<int> temp_tracker = tracker;
temp_tracker.push_back(i);
/*
cout << "right before dfs" << endl;
for (int i = 0; i < temp_tracker.size(); i++) {
cout << temp_tracker[i] << " ";
}
cout << " == " << res << endl;
*/
one_proc(res, s + 1, yeons,temp_tracker);
yeons[i]++;//복구
}
}
int main() {
int n;
vector<int> yeons;//4가지 연산자의 개수
cin >> n;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
nums.push_back(num);
}
for (int i = 0; i < 4; i++) {
cin >> num;
yeons.push_back(num);
}
vector<int> tracker;
one_proc(nums[0], 1, yeons,tracker);
cout << mmax << endl;
cout << mmin << endl;
}
Reference
この問題について([サムスン148888]挿入演算子), 我々は、より多くの情報をここで見つけました https://velog.io/@coding3392/삼성-14888-연산자-끼워넣기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol