#include <iostream> #include <string> #include <algorithm> #include <cstdio> #include <vector> #include <queue> #include <set> #include <map> #include <numeric> #include <cmath> using namespace std; typedef long long int ll; #define all(x) x.begin(),x.end() const ll mod = 1e9+7; const ll INF = 1e9; const ll MAXN = 1e9; int main() { int n; cin >> n; vector<int> v(n); for(int i = 0; i < n; i++){ cin >> v[i]; } map<int,int> even,odd;//1 for(int i = 0; i < n; i++){ if(i%2==0) odd[v[i]]++; else even[v[i]]++; } int even_1=0,even_2=0,odd_1=0,odd_2=0;//偶奇それぞれの最頻値と2番目の最頻値 int e1=0,e2=0,o1=0,o2=0; int cnt = 0; //2 for(auto itr = even.begin(); itr != even.end() ; ++itr){ if(itr->second > cnt){ cnt = itr->second; even_1 = itr->first; } } e1 = cnt; cnt = 0; for(auto itr = even.begin(); itr != even.end() ; ++itr){ if(itr->second > cnt && itr->first != even_1){ cnt = itr->second; even_2 = itr->first; } } e2 = cnt; cnt = 0; for(auto itr = odd.begin(); itr != odd.end() ; ++itr){ if(itr->second > cnt){ cnt = itr->second; odd_1 = itr->first; } } o1= cnt; cnt = 0; for(auto itr = odd.begin(); itr != odd.end() ; ++itr){ if(itr->second > cnt && itr->first != odd_1){ cnt = itr->second; odd_2 = itr->first; } } o2=cnt; if(even_1 == odd_1){ cout << min(n-e1-o2, n-e2-o1) << endl; }else{ cout << n-e1-o1 << endl; } return 0; }
ex)
1323222111231232211233
odd 33211322123
even 12221213213
1.これはmapの質問になってしまうのですがkeyはv[i]なのでmap<vector<int>, int>
ではないのですか?結局この作業では僕の例で言うとoddでは数字とその出現個数の対の(key,value)=(1,3),(2,4),(3,4)となるとは思うのですが。。
2.このfor文は全体的に理解できていません。イテレータをvalueに当てて...から分かりません。。そこが理解できればひとつ下のfor文はeven_1とodd_1が同じになった時の処理だと思うのでそれ以降も理解できると思うのですが。
以上になります、長文ですがよろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/10 04:14
2020/05/10 04:21
2020/05/10 10:44
2020/05/10 11:03
2020/05/11 09:10
2020/05/11 09:12
2020/05/11 09:23
2020/05/11 09:43
2020/05/11 10:43
2020/05/12 12:08