AtCoder Beginner Contest 111 C - /\/\/\/
問題
AtCoder Beginner Contest 111 C - /\/\/\/
C - /\/\/\/
使用言語
C++
方針
・iが奇数,偶数の時に登場する数の個数で考える.奇数,偶数でaiがどれくらい出てきたかをp1[i], p2[i]で管理.
・場合分け
p1,p2のどちらかに複数の最頻値があるor p1,p2の唯一の最頻値が使う
→その最頻値を使う
上記以外
→p1の最頻値とp2の2番目かp2の最頻値とp1の2番目のどちらかを使う(片方の最頻値ともう片方の2番目が同じ数字になることはない,上で弾かれるため)
所感
・バグ祭りで死にましたかかってしまった.無念..
・ACまでに想定していた時間の5倍くらい
コード
#include <iostream> #include <algorithm> #include <vector> using namespace std; #define FOR(i,a,b) for (size_t i = a; i < b; i++) #define REP(i,b) FOR(i,0,b) #define RFOR(i,a,b) for (size_t i = a-1; i >= b; i--) #define RREP(i,a) RFOR(i,a,0) #define INF 1e7 #define num 111111 int p1[num], p2[num]; vector<int> a, b; int main() { int n, m1 = 1, m2 = 1, tmp; cin>>n; REP(i,n/2) { cin>>tmp; p1[tmp]++; cin>>tmp; p2[tmp]++; } REP(i,num) { if (p1[i] > m1) { a.clear(); a.push_back(i); m1 = p1[i]; } else if (p1[i] == m1) { a.push_back(i); } if (p2[i] > m2) { b.clear(); b.push_back(i); m2 = p2[i]; } else if (p2[i] == m2) { b.push_back(i); } } if (a.size() > 2 || b.size() > 2) { cout<<n - m1 - m2<<endl; } else if (a[0] != b[0]) { cout<<n - m1 - m2<<endl; } else { sort(p1, p1+num); sort(p2, p2+num); int r = max(m1 + p2[num-2], m2 + p1[num-2]); cout<<n-r<<endl; } return 0; }