Problem:
C : Mod!Mod!
物語
じゃん！探してますよ目撃証言！
会津に怪盗が現れた！みんなのウマウマ棒が盗まれた！犯人は誰だ！？
解きあかせ！Mod!Mod!
問題文
"アイズ"...それは選ばれし者の心に膨らむ奇跡のつぼみ...。特殊能力"アイズ"を使えばどんなものだって盗むことができる。
会津一の大怪盗、あいずまるは世界を謎で満たすために
n
人の探偵から「ウマウマ棒」を盗むことにした。ウマウマ棒とはあいずまるが大好きなただのお菓子であり、
n
人の探偵はそれぞれ数本のウマウマ棒を持っている。また、あいずまるは強欲なためそれぞれの探偵からウマウマ棒を盗むとき、その探偵が所持する全てのウマウマ棒を盗む。
ウマウマ棒の3本同時食いにハマっているあいずまるは、3本以上のウマウマ棒が手元にあるとき、誘惑に負けて手持ちのウマウマ棒が3本未満になるまで、3本ずつウマウマ棒を食べてしまう。しかし、あいずまるは手元にウマウマ棒がないとショックでアイズを失ってしまい、それ以上ウマウマ棒を盗むことができなくなってしまう。つまり、ウマウマ棒を盗むためには手持ちのウマウマ棒の本数を1本以上にしておく必要があり、0本になるとそれ以上ウマウマ棒を盗むことができなくなる。
少しでも多くの探偵からウマウマ棒を盗みたいあいずまるは、どの探偵から順にウマウマ棒を盗むかによって何人の探偵からウマウマ棒を盗めるのかが変わることに気づいた。しかし、あいずまるには難しいことは分からない。「ハテー？」あいずまるの優秀な部下であるあなたは、あいずまるの代わりに最大で何人の探偵からウマウマ棒を盗むことができるのかを求めるプログラムを書いてあげることにした。
探偵の人数
n
と、
n
人の探偵からそれぞれ何本のウマウマ棒を盗むのかが与えられるので、最適な順番で探偵からウマウマ棒を盗んだとき、最大で何人の探偵からウマウマ棒を盗むことができるかを出力するプログラムを作成せよ。ただし、はじめの手持ちのウマウマ棒の本数は0であるが、最初に限り手持ちが0本でもウマウマ棒を盗むことができるとする。
入力形式
入力は2行からなり、以下の形式で与えられる。
n
a_1
a_2
…
a_n
1行目には、ウマウマ棒を盗む探偵の数である整数
n
が与えられる。
2行目には、各探偵から盗むウマウマ棒の本数
n
個が空白区切りで与えられる。
制約
1 ≤ n ≤ 500{,}000
1 ≤ a_i ≤ 9
(
1 ≤ i ≤ n
)
出力形式
最適な順番で探偵からウマウマ棒を盗んだとき、最大で何人の探偵からウマウマ棒を盗むことができるか一行に出力せよ。
入力例1
6
2 5 2 5 2 1
出力例1
5
2 5 1 2 5の順で盗むと5人から盗むことができる。どのような順序で盗んでも6人から盗むことはできない。
入力例2
3
3 6 9
出力例2
1
どの1人から盗んでも手持ちのウマウマ棒の本数は0になってしまい、アイズを失ってしまう。
入力例3
6
1 2 3 4 5 6
出力例3
6

Submitted solutions:

code_snippet: #include <iostream>
using namespace std;

long long N;
long long A[1 << 19];
long long C[3];

int main() {
	// Step 1. Input
	cin >> N;
	for (int i = 1; i <= N; i++) cin >> A[i];
	for (int i = 1; i <= N; i++) C[A[i] % 3] += 1;

	// Step 2. First Case
	if (C[1] + C[2] == 0) {
		cout << min(1LL, C[0]) << endl;
		return 0;
	}
	
	// Step 3. Second Case
	C[1] = min(C[1], C[2] + 3);
	C[2] = min(C[2], C[1] + 3);
	cout << C[0] + C[1] + C[2] << endl;
	return 0;
}
accuracy: 1
time_ms: 40
memory_kb: 7512
final_rank: 15

code_snippet: #include <iostream>
using namespace std;

long long N;
long long A[1 << 18];
long long C[3];

int main() {
	// Step 1. Input
	cin >> N;
	for (int i = 1; i <= N; i++) cin >> A[i];
	for (int i = 1; i <= N; i++) C[A[i] % 3] += 1;

	// Step 2. First Case
	if (C[1] + C[2] == 0) {
		cout << min(1LL, C[0]) << endl;
		return 0;
	}
	
	// Step 3. Second Case
	C[1] = min(C[1], C[2] + 3);
	C[2] = min(C[2], C[1] + 3);
	cout << C[0] + C[1] + C[2] << endl;
	return 0;
}
accuracy: 0.11392405063291139
time_ms: 20
memory_kb: 5392
final_rank: 20

code_snippet: #include<bits/stdc++.h>
using namespace std;
using ll=long long;
ll v[3];
int main(void){
    ll n,ans=0;
    cin>>n;
    vector<ll> a(n);
    for(ll i=0;i<n;i++){
        cin>>a[i];
        v[a[i]%3]++;
    }
    ll MIN=min(v[1],v[2]),MAX=max(v[1],v[2]);
    ans=MIN+min(MAX,MIN+3);
    ans+=v[0];
    if(v[1]==0 && v[2]==0){
        cout<<1<<endl;
    }else{
        cout<<ans<<endl;
    }
    return 0;
}
accuracy: 1
time_ms: 30
memory_kb: 7044
final_rank: 12

code_snippet: #include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
using std::cout;
using std::cin;
using std::endl;
using ll=long long;
using ld=long double;
ll ILL=2167167167167167167;
const int INF=2100000000;
const ll mod=998244353;
#define rep(i,a) for (ll i=0;i<a;i++)
#define all(p) p.begin(),p.end()
template<class T> using _pq = priority_queue<T, vector<T>, greater<T>>;
template<class T> ll LB(vector<T> &v,T a){return lower_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> ll UB(vector<T> &v,T a){return upper_bound(v.begin(),v.end(),a)-v.begin();}
template<class T> bool chmin(T &a,const T &b){if(a>b){a=b;return 1;}else return 0;}
template<class T> bool chmax(T &a,const T &b){if(a<b){a=b;return 1;}else return 0;}
template<class T> void So(vector<T> &v) {sort(v.begin(),v.end());}
template<class T> void Sore(vector<T> &v) {sort(v.begin(),v.end(),[](T x,T y){return x>y;});}
void yneos(bool a){if(a) cout<<"Yes\n"; else cout<<"No\n";}
template<class T> void vec_out(vector<T> &p){for(int i=0;i<(int)(p.size());i++){if(i) cout<<" ";cout<<p[i];}cout<<"\n";}
template<class T> T min(vector<T> &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmin(ans,x);return ans;}
template<class T> T max(vector<T> &a){assert(!a.empty());T ans=a[0];for(auto &x:a) chmax(ans,x);return ans;}


void solve();
// oddloop
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t=1;
	//cin>>t;
	rep(i,t) solve();
}

void solve(){
	int N;
	cin>>N;
	vector<int> p(3);
	rep(i,N){
		int a;
		cin>>a;
		p[a%3]++;
	}
	if(p[0]==N) cout<<"1\n";
	else{
		if(p[1]<p[2]) swap(p[1],p[2]);
		int ans=p[0]+1;
		p[1]--;
		int x=0;
		while(true){
			if(p[x+1]==0) break;
			p[x+1]--;
			ans++;
			x^=1;
		}
		if(ans!=N) ans++;
		cout<<ans<<"\n";
	}
}
accuracy: 1
time_ms: 10
memory_kb: 3440
final_rank: 2

code_snippet: #include <bits/stdc++.h>
//#include <atcoder/all>
using namespace std;

#define all(x) (x).begin(),(x).end()
#define print(x) cout << (x) << '\n'
typedef long long ll;
typedef long double ld;
using P = pair<int,int>;
using pll = pair<ll,ll>;
using Graph = vector<vector<int>>;

//using mint = atcoder :: modint998244353;
//const ll MOD = 1000000007;
//const ll MOD = 998244353;

template <typename T> inline bool chmax(T &a, T b) {return a < b ? a = b, true : false;}
template <typename T> inline bool chmin(T &a, T b) {return a > b ? a = b, true : false;}

template <typename T>
void vin(vector<T> &v) {
    int l = v.size();
    for(int i = 0; i < l; i++) cin >> v[i];
}

template <typename T>
void vout(vector<T> &v) {
    int l = v.size();
    for(int i = 0; i < l; i++) cout << v[i] << " \n"[i == l - 1];
}

int main() {
    cin.tie(0); cout.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(18);

    int n;  cin >> n;
    vector<int> c(3, 0);
    for(int i = 0; i < n; i++) {
        int a;  cin >> a;
        c[a % 3]++;
    }
    if(c[1] + c[2] == 0) {
        print(1);
    } else {
        int ans = 0;
        for(int t = 1; t <= 2; t++) {
            int cnt = c[0];
            vector<int> d = {c[1], c[2]};
            int now = -1;
            if(d[t - 1] > 0) {
                d[t - 1]--;
                now = t;
                cnt++;
            }
            for(int i = 0; i < n - c[0]; i++) {
                if(now == 1) {
                    if(d[0] == 0) break;
                    else {
                        d[0]--;
                        now = 2;
                        cnt++;
                    }
                } else if(now == 2) {
                    if(d[1] == 0) break;
                    else {
                        d[1]--;
                        now = 1;
                        cnt++;
                    }
                }
            }
            if(d[0] + d[1] > 0) cnt++;
            chmax(ans, cnt);
        }
        print(ans);
    }
    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3440
final_rank: 2

code_snippet: #include <bits/stdc++.h>
//#include <atcoder/all>
//using namespace atcoder;
#pragma GCC target ("avx2")
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
using namespace std;
 
typedef vector<int> VI;
typedef vector<VI> VVI;
typedef vector<string> VS;
typedef pair<int, int> PII;
typedef pair<int, int> pii;
typedef pair<long long, long long> PLL;
typedef pair<int, PII> TIII;
 
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
 
 
#define FOR(i, s, n) for (int i = s; i < (int)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define rep(i, a, b) for (int i = a; i < (b); ++i)
#define trav(a, x) for (auto &a : x)
#define all(x) x.begin(), x.end()
 
#define MOD 1000000007
 
template<class T1, class T2> inline bool chmax(T1 &a, T2 b) {if (a < b) {a = b; return true;} return false;}
template<class T1, class T2> inline bool chmin(T1 &a, T2 b) {if (a > b) {a = b; return true;} return false;}
const double EPS = 1e-8, PI = acos(-1);
const double pi = 3.141592653589793238462643383279;
//ここから編集    
typedef string::const_iterator State;
ll GCD(ll a, ll b){
  return (b==0)?a:GCD(b, a%b);
}
ll LCM(ll a, ll b){
  return a/GCD(a, b) * b;
}
template< int mod >
struct ModInt {
  int x;
 
  ModInt() : x(0) {}
 
  ModInt(int64_t y) : x(y >= 0 ? y % mod : (mod - (-y) % mod) % mod) {}
 
  ModInt &operator+=(const ModInt &p) {
    if((x += p.x) >= mod) x -= mod;
    return *this;
  }
 
  ModInt &operator-=(const ModInt &p) {
    if((x += mod - p.x) >= mod) x -= mod;
    return *this;
  }
 
  ModInt &operator*=(const ModInt &p) {
    x = (int) (1LL * x * p.x % mod);
    return *this;
  }
 
  ModInt &operator/=(const ModInt &p) {
    *this *= p.inverse();
    return *this;
  }
 
  ModInt operator-() const { return ModInt(-x); }
 
  ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
 
  ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
 
  ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
 
  ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }
 
  bool operator==(const ModInt &p) const { return x == p.x; }
 
  bool operator!=(const ModInt &p) const { return x != p.x; }
 
  ModInt inverse() const {
    int a = x, b = mod, u = 1, v = 0, t;
    while(b > 0) {
      t = a / b;
      swap(a -= t * b, b);
      swap(u -= t * v, v);
    }
    return ModInt(u);
  }
 
  ModInt pow(int64_t n) const {
    ModInt ret(1), mul(x);
    while(n > 0) {
      if(n & 1) ret *= mul;
      mul *= mul;
      n >>= 1;
    }
    return ret;
  }
 
  friend ostream &operator<<(ostream &os, const ModInt &p) {
    return os << p.x;
  }
 
  friend istream &operator>>(istream &is, ModInt &a) {
    int64_t t;
    is >> t;
    a = ModInt< mod >(t);
    return (is);
  }
 
  static int get_mod() { return mod; }
};
 
using modint = ModInt< 998244353 >;
template< typename T >
struct Combination {
  vector< T > _fact, _rfact, _inv;
 
  Combination(int sz) : _fact(sz + 1), _rfact(sz + 1), _inv(sz + 1) {
    _fact[0] = _rfact[sz] = _inv[0] = 1;
    for(int i = 1; i <= sz; i++) _fact[i] = _fact[i - 1] * i;
    _rfact[sz] /= _fact[sz];
    for(int i = sz - 1; i >= 0; i--) _rfact[i] = _rfact[i + 1] * (i + 1);
    for(int i = 1; i <= sz; i++) _inv[i] = _rfact[i] * _fact[i - 1];
  }
 
  inline T fact(int k) const { return _fact[k]; }
 
  inline T rfact(int k) const { return _rfact[k]; }
 
  inline T inv(int k) const { return _inv[k]; }
 
  T P(int n, int r) const {
    if(r < 0 || n < r) return 0;
    return fact(n) * rfact(n - r);
  }
 
  T C(int p, int q) const {
    if(q < 0 || p < q) return 0;
    return fact(p) * rfact(q) * rfact(p - q);
  }
 
  T H(int n, int r) const {
    if(n < 0 || r < 0) return (0);
    return r == 0 ? 1 : C(n + r - 1, r);
  }
};
 
ll modpow(ll x, ll n, ll mod) {
  ll res = 1;
  x %= mod;
  if(x == 0) return 0;
  while(n) {
    if(n&1) res = (res * x) % mod;
    x = (x * x) % mod;
    n >>= 1;
  }
  return res;
} 
inline long long mod(long long a, long long m) {
    return (a % m + m) % m;
}
template<typename T> 
struct BIT{
  int N;
  std::vector<T> node;
  BIT(){}
  BIT(int n){
    N = n;
    node.resize(N+10);
  }
  void build(int n) {
    N = n;
    node.resize(N+10);
  }
  /* a: 1-indexed */
  void add(int a, T x){
    for(int i=a; i<(int)node.size(); i += i & -i) node[i] += x;
  }

  /* [1, a] */
  T sum(int a){
    T res = 0;
    for(int x=a; x>0; x -= x & -x) res += node[x];
    return res;
  }

  /* [l, r] */
  T rangesum(int l, int r){
    return sum(r) - sum(l-1);
  }

  /* 
    a1+a2+...+aw >= valとなるような最小のwを返す
    @verify https://codeforces.com/contest/992/problem/E
  */
  int lower_bound(T val) {
    if(val < 0) return 0;

    int res = 0;
    int n = 1; 
    while (n < N) n *= 2;

    T tv=0;
    for (int k = n; k > 0; k /= 2) {
      if(res + k < N && node[res + k] < val){
        val -= node[res+k];
        res += k;
      }
    }
    return res+1; 
  }
};
struct UnionFind{
  std::vector<int> par;
  std::vector<int> siz;

  UnionFind(int sz_): par(sz_), siz(sz_) {
    for(int i=0; i<sz_; ++i) par[i] = i, siz[i] = 1;
  }

  void init(int sz_){
    par.resize(sz_);
    siz.resize(sz_);
    for(int i=0; i<sz_; ++i) par[i] = i, siz[i] = 1;
  }

  int root(int x){
    if(x == par[x]) return x;
    return par[x] = root(par[x]);
  }

  bool merge(int x, int y){
    x = root(x), y = root(y);
    if(x == y) return false;
    if(siz[x] < siz[y]) std::swap(x, y);
    siz[x] += siz[y];
    par[y] = x;
    return true;
  }

  bool issame(int x, int y){
    return root(x) == root(y);
  }

  int size(int x){
    return siz[root(x)];
  }
};
struct RollingHash{

    using ull = unsigned long long;
    const ull mod = (1ULL << 61) - 1;
    const ull MASK30 = (1ULL << 30) - 1;
    const ull MASK31 = (1ULL << 31) - 1;

    const ull MASK61 = mod;

    ull base;
    int n;
    vector<ull> hash, pow;

    RollingHash(const string &s)
    {
        random_device rnd;
        mt19937_64 mt(rnd());
        base = 1001;
        
        n = (int)s.size();
        hash.assign(n+1, 0);
        pow.assign(n+1, 1);
        
        for(int i=0; i<n; i++){
            hash[i+1] = calc_mod(mul(hash[i], base) + s[i]);
            pow[i+1] = calc_mod(mul(pow[i], base));
        }
    }

    ull calc_mod(ull x){
        ull xu = x >> 61;
        ull xd = x & MASK61;
        ull res = xu + xd;
        if(res >= mod) res -= mod;
        return res;
    }

    ull mul(ull a, ull b){
        ull au = a >> 31;
        ull ad = a & MASK31;
        ull bu = b >> 31;
        ull bd = b & MASK31;
        ull mid = ad * bu + au * bd;
        ull midu = mid >> 30;
        ull midd = mid & MASK30;
        return calc_mod(au * bu * 2 + midu + (midd << 31) + ad * bd);
    }

    //[l,r)のハッシュ値
    inline ull get(int l, int r){
        ull res = calc_mod(hash[r] + mod*3-mul(hash[l], pow[r-l]));
        return res;
    }
    //string tのハッシュ値
    inline ull get(string t){
        ull res = 0;
        for(int i=0; i<t.size(); i++){
            res = calc_mod(mul(res, base)+t[i]);
        }
        return res;
    }
    //string s中のtの数をカウント
    inline int count(string t) {
        if(t.size() > n) return 0;
        auto hs = get(t);
        int res = 0;
        for(int i=0; i<n-t.size()+1; i++){
            if(get(i, i+t.size()) == hs) res++; 
        }
        return res;
    }

    /* 
        concat 
        @verify https://codeforces.com/problemset/problem/514/C
    */
    inline ull concat(ull h1, ull h2, int h2len){
      return calc_mod(h2 + mul(h1, pow[h2len]));
    }

    // LCPを求める S[a:] T[b:]
    inline int LCP(int a, int b){
        int len = min((int)hash.size()-a, (int)hash.size()-b);
        
        int lb = -1, ub = len;
        while(ub-lb>1){
            int mid = (lb+ub)/2;

            if(get(a, a+mid) == get(b, b+mid)) lb = mid;
            else ub = mid;
        }
        return lb;
    }
};
int cnt[3];
int dfs(int v) {
  int res = 0;
  if(v == 1) {
    if(cnt[1]) {
      cnt[1]--;
      res = max(res, dfs(2) + 1);
      cnt[1]++;
    }
    if(cnt[2]) res = max(res,1);
    
  }else if(v == 2) {
    if(cnt[2]) {
      cnt[2]--;
      res = max(res, dfs(1) + 1);
      cnt[2]++;
    }
    if(cnt[1]) res = max(res, 1);
  }
  return res;
}
int main() {  
    cin.tie(0);
    ios::sync_with_stdio(false);
    cout << fixed << setprecision(12);

    int n; cin >> n;
    vector<int> a(n);
    
    REP(i,n) {
      cin >> a[i];
      cnt[a[i]%3]++;
    }
    int ans = cnt[0];
    int f1=0, f2=0;
    if(cnt[1]) {
      cnt[1]--;
      f1 = dfs(1) + 1;
      cnt[1]++;
    }
    if(cnt[2]) {
      cnt[2]--;
      f2 = dfs(2) + 1;
      cnt[2]++;
    }
    if(cnt[1]==0&&cnt[2]==0)ans=1;
    cout << ans + max(f1, f2) << endl; 
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 12844
final_rank: 17

code_snippet: #include<bits/stdc++.h>
template<class T> inline bool chmax(T& a, T b){ if (a < b){ a = b; return true; } return false; }
template<class T> inline bool chmin(T& a, T b){ if (a > b){ a = b; return true; } return false; }
using namespace std;
using ll = long long;
ll mod = 1e9+7;
const int dx[8] = {-1,0,1,0,-1,-1,1,1};
const int dy[8] = {0,1,0,-1,1,-1,1,-1};

int main(){
    int n;
    cin >> n;
    vector<int> cnt(3,0);
    for(int i=0;i<n;++i) {
        int a;
        cin >> a;
        cnt[a%3]++;
    }

    int ans1=0, ans2=0;
    vector<int> c1(n), c2(n);
    copy(cnt.begin(), cnt.end(), c1.begin());
    copy(cnt.begin(), cnt.end(), c2.begin());
    if (cnt[1]) {
        ans1 = c1[0]+1;
        c1[1]--;
        while(true){
            if (c1[1]==0) break;
            ans1++;
            c1[1]--;
            if (c1[2]==0) break;
            ans1++;
            c1[2]--;
        }
        ans1 += min(1, c1[1]+c1[2]);
    }
    if (cnt[2]) {
        ans2=c2[0]+1;
        c2[2]--;
        while(true){
            if(c2[2]==0) break;
            c2[2]--;
            ans2++;
            if(c2[1]==0) break;
            c2[1]--;
            ans2++;
        }
        ans2 += min(1, c2[1]+c2[2]);
    }
    int ans = 1;
    ans = max(ans, ans1);
    ans = max(ans, ans2);
    cout << ans << endl;
}
accuracy: 1
time_ms: 50
memory_kb: 6788
final_rank: 16

code_snippet: #include <iostream>
using namespace std;
int b[3];
int c[3];
int main() {
	// your code goes here
	int n,t;
	cin>>n;
	for(int i=0;i<3;i++){
		b[i]=0;
		c[i]=0;
	}
	int ans=1;
	for(int i=0;i<n;i++){
		cin>>t;
		b[t%3]++;
		c[t%3]++;
	}
	int c1=0;
	if(b[1]>0){
		b[1]--;
		c1+=1;
		c1+=b[0];
		b[0]=0;
		int i=1;
		while(b[i]>=0){
			if(i==1){
				if(ans<c1+1 && b[2]>0)ans=c1+1;
			}else{
				if(ans<c1+1 && b[1]>0)ans=c1+1;
			}
			if(b[i]==0)break;
			b[i]--;
			c1++;
			if(i==1){
				i=2;
			}else{
				i=1;
			}
		}
	}
	if(ans<c1)ans=c1;
	
	c1=0;
	if (c[2]>0){
		c[2]--;
		c1+=1;
		c1+=c[0];
		c[0]=0;
		int i=2;
		while(c[i]>=0){
			if(i==1){
				if(ans<c1+1 && c[2]>0)ans=c1+1;
			}else{
				if(ans<c1+1 && c[1]>0)ans=c1+1;
			}
			if(c[i]==0)break;
			c[i]--;
			c1++;
			if(i==1){
				i=2;
			}else{
				i=1;
			}
		}
	
	}
	if(ans<c1)ans=c1;
	cout<<ans<<endl;
	return 0;
}
accuracy: 1
time_ms: 50
memory_kb: 3132
final_rank: 11

code_snippet: #include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <functional>
#include <bitset>

using namespace std;
using lint = long long int;
long long int INF = 1001001001001001LL;
int inf = 1000000007;
long long int MOD = 1000000007LL;
double PI = 3.1415926535897932;

template<typename T1,typename T2>inline void chmin(T1 &a,const T2 &b){if(a>b) a=b;}
template<typename T1,typename T2>inline void chmax(T1 &a,const T2 &b){if(a<b) a=b;}

#define ALL(a) a.begin(),a.end()
#define RALL(a) a.rbegin(),a.rend()

/* do your best */

int main() {
  
  int n; cin >> n;
  vector<int> a(n);
  vector<int> cnt(3, 0);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
    cnt[a[i] % 3]++;
  }

  if (cnt[0] == n) {
    cout << 1 << endl;
    return 0;
  }
  
  lint ans = cnt[0];
  if (cnt[1] > cnt[2]) {
    swap(cnt[1], cnt[2]);
  }
  
  ans += cnt[1] + min(cnt[1] + 3, cnt[2]);
  cout << ans << endl;

  return 0;
}
accuracy: 1
time_ms: 50
memory_kb: 4672
final_rank: 13

code_snippet: #include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define FOR(i,x,n) for(int i=x; i<(n); i++)
#define ALL(n) begin(n),end(n)
#define MOD 1000000007
 
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
void print(int x){printf("%d\n", x);}
void print(ll x){printf("%lld\n", x);}
void printvec(vector<int>& a){
rep(i, a.size()-1){
printf("%d ", a[i]);
}
printf("%d\n", a[a.size()-1]);
}
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
 
int main()
{
    int n;
    cin >> n;
    vector<int> md(3, 0);
    int r;
    rep(i, n){
        scanf("%d", &r);
        md[r%3]++;
    }
    // printvec(md);
    if(md[1]==0 && md[2]==0){
        printf("1\n");
        return 0;
    }

    int ans=md[0];
    if(md[1]==md[2]){
        ans += 2*md[1];
    }else if(md[1]>md[2]){
        if(md[1]==1) {
            ans++;
        }else{
            md[1] -= 2;
            int m = min(md[1], md[2]);
            ans += 2*m + 2;
            md[1] -= m; md[2] -= m;
            if(md[2]==0){
                if(md[1]!=0) ans++;
            }else if(md[2]==1){
                ans++;
            }else{
                ans+=2;
            }
        }
    }else{
        if(md[2]==1) {
            ans++;
        }else{
            md[2] -= 2;
            int m = min(md[1], md[2]);
            ans += 2*m + 2;
            md[1] -= m; md[2] -= m;
            if(md[1]==0){
                if(md[2]!=0) ans++;
            }else if(md[1]==1){
                ans++;
            }else{
                ans+=2;
            }
        }
    }

    print(ans);
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 3228
final_rank: 6

code_snippet: #include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0; i<(n); i++)
#define FOR(i,x,n) for(int i=x; i<(n); i++)
#define ALL(n) begin(n),end(n)
#define MOD 1000000007
 
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
void print(int x){printf("%d\n", x);}
void print(ll x){printf("%lld\n", x);}
void printvec(vector<int>& a){
rep(i, a.size()-1){
printf("%d ", a[i]);
}
printf("%d\n", a[a.size()-1]);
}
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
 
int main()
{
    int n;
    cin >> n;
    vector<int> md(3, 0);
    int r;
    rep(i, n){
        scanf("%d", &r);
        md[r%3]++;
    }
    // printvec(md);
    if(md[1]==0 && md[2]==0){
        printf("1\n");
        return 0;
    }

    int ans=md[0];
    if(md[1]==md[2]){
        ans += 2*md[1];
    }else if(md[1]>md[2]){
        if(md[1]==1) {
            ans++;
        }else{
            md[1] -= 2;
            int m = min(md[1], md[2]);
            ans += 2*m + 2;
            md[1] -= m; md[2] -= m;
            if(md[2]==0){
                if(md[1]!=0) ans++;
            }else{
                if(md[2]==1) ans++;
                else ans += 2;
            }
        }
    }else{
        if(md[2]==1) {
            ans++;
        }else{
            md[2] -= 2;
            int m = min(md[1], md[2]);
            ans += 2*m + 2;
            md[1] -= m; md[2] -= m;
            if(md[1]==0){
                if(md[2]!=0) ans++;
            }else{
                if(md[2]==1) ans++;
                else ans += 2;
            }
        }
    }

    print(ans);
    return 0;
}
accuracy: 0.7848101265822784
time_ms: 20
memory_kb: 3228
final_rank: 19

code_snippet: #include<bits/stdc++.h>
using namespace std;
using ll = long long;
using P = pair<int,int>;
#define enld '\n'
#define rep(i,n) for(int i=0; i<(n); i++)
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("Ofast")
constexpr ll INF = 1e18;
constexpr int inf = 1e9;
constexpr ll mod = 1000000007;
constexpr ll mod2 = 998244353;
const double PI = 3.1415926535897932384626433832795028841971;
const int dx[8] = {1, 0, -1, 0,1,1,-1,-1};
const int dy[8] = {0, 1, 0, -1,1,-1,-1,1};
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
// ---------------------------------------------------------------------------


int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n;
    cin >> n;
    vector<int> a(n);
    rep(i,n) cin >> a[i];
    vector<int> cnt(3,0);
    rep(i,n){
        cnt[a[i]%3]++;
    }
    if(cnt[1]==0 and cnt[2]==0){
        cout << 1 << "\n";
    }else{
        int ans = cnt[0];
        ans += min(cnt[1],cnt[2]) * 2;
        ans += min(3,max(cnt[1],cnt[2])-min(cnt[1],cnt[2]));
        cout << ans << "\n";
    }
    return 0;
}
accuracy: 1
time_ms: 20
memory_kb: 4672
final_rank: 7

code_snippet: #include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
    int n;
    cin >> n;
    vector<int> a(3, 0);
    for(int i=0; i<n; i++){
        int tmp;
        cin >> tmp;
        a[tmp%3]++;
    }

    int ans = 0;
    if(a[0] == n){
        ans = 1;
    }else if(a[1] < a[2]){
        ans = a[0]+a[1]+min(a[2], a[1]+3);
    }else{
        ans = a[0]+a[2]+min(a[1], a[2]+3);
    }
    cout << ans << endl;
    return 0;
}
accuracy: 1
time_ms: 50
memory_kb: 3104
final_rank: 8

code_snippet: #include <bits/stdc++.h>

using namespace std;
using ll = long long;

int main() {
    int n;
    cin>>n;
    vector<int> uma(n);
    vector<int> ama(3,0);
    vector<vector<int>> hon(3);
    for(int i = 0;i < n;++i) {
        cin>>uma[i];
        ++ama[uma[i]%3];
        hon[uma[i]%3].emplace_back(uma[i]);
    }
    sort(hon[0].begin(),hon[0].end());
    sort(hon[1].begin(),hon[1].end());
    sort(hon[2].begin(),hon[2].end());

    int a=ama[0];
    int b=ama[1];
    int c=ama[2];

    int ans=0;
    if(b==0&&c==0) {
        cout<<1<<endl;
    }
    else if(b==c||b+1==c||c+1==b) {

        cout<<n<<endl;
    }
    else if(b+3<=c) {
        ans+=a;
        ans+=b;
        for(int i = 0;i < b+3;++i) {
            ans++;
        }
        cout<<ans<<endl;
    }
    else {
        ans+=a;
        ans+=c;
        for(int i = 0;i < min(b,c+3);++i) {
            ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}
accuracy: 1
time_ms: 60
memory_kb: 7000
final_rank: 18

code_snippet: #include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef pair<ll,ll> mp;
ll inf =  1e9;


int main(){
 int n;
 cin>>n;
 vector<int> a(n);
 vector<int> cnt(3,0);
 for(int i=0;i<n;i++){
  cin>>a[i];
  cnt[ a[i]%3 ]++;
 }

 if( cnt[1] == 0 && cnt[2] == 0 ){
  cout<<1<<endl;
  return 0;
 }

 //cout<<cnt[1]<<' '<<cnt[2]<<endl;

 int ans = 0;
 for(int j=1;j<=2;j++){
  vector<int> tmp= cnt;
  if( tmp[j] != 0 ){
   int sum = 0;
   sum = tmp[0]+1;
   int now = j;
   tmp[j]--;

   //cout<<sum<<' '<<now<<' '<<tmp[1]<<' '<<tmp[2]<<endl;
   while( tmp[now] != 0 ){
    tmp[now]--;
    //cout<<now<<endl;
    now += now;
    now %= 3;
    sum++;
   //cout<<sum<<' '<<now<<' '<<tmp[1]<<' '<<tmp[2]<<endl;
   }
   if( tmp[1] || tmp[2] ) sum++;
   //cout<<j<<' '<<sum<<endl;
   ans = max(ans,sum);
  }

 }
 cout<<ans<<endl;


    return 0;
}
accuracy: 1
time_ms: 50
memory_kb: 4684
final_rank: 14

code_snippet: #include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,a;
    int cnt[3]={};
    
    cin >> n;
    for(int i=0;i<n;i++){
        cin >> a;
        cnt[a%3]++;
    }
    
    int ans = 0;
    if(cnt[0] < n) ans += cnt[0];
    if(cnt[1] > cnt[2]){
        cnt[1]--;
        ans++;
    } else if(cnt[2] > 0){
        cnt[2]--;
        ans++;
    }
    ans += min(cnt[1],cnt[2])*2;
    if(cnt[1] != cnt[2]) ans++;
    if(ans < n) ans++;
    
    cout << ans << endl;
    
    return(0);
}
accuracy: 1
time_ms: 50
memory_kb: 3104
final_rank: 8

code_snippet: #include "bits/stdc++.h"

using namespace std;

int N,M,K,L,R,H,W;
//long long int N,M,K,L,R,H,W;

constexpr long long int MOD=1000000007;
//constexpr  int MOD=1000000007;
//constexpr int MOD=998244353;
//constexpr long long int MOD=998244353;

constexpr long double EPS=1e-8;



int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	cin>>N;
	vector<int>w(N);
	for(auto &i:w)cin>>i;
	vector<int>v(4);
	for(auto i:w){
		v[i%3]++;
	}
	if(v[0]==N){
		cout<<1<<endl;
		return 0;
	}
	if(v[1]==N){
		cout<<min(3,N)<<endl;
		return 0;
	}
	if(v[2]==N){
		cout<<min(3,N)<<endl;
		return 0;
	}
	int ans=1;
	if(v[1]>=2){
		ans=max(ans,2+min(v[2],v[1]-2)*2+v[0]);
	}
	if(v[1]>=3){
		ans=max(ans,3+min(v[2],v[1]-3)*2+v[0]);
	}
	if(v[2]>=2){
		ans=max(ans,2+min(v[1],v[2]-2)*2+v[0]);
	}
	if(v[2]>=3){
		ans=max(ans,3+min(v[1],v[2]-3)*2+v[0]);
	}
	if(v[1]&&v[2]){
		ans=max(ans,2+min(v[1]-1,v[2]-1)*2+v[0]);
	}
	if(v[1]){
		ans=max(ans,1+min(v[1]-1,v[2])*2+v[0]);
	}
	if(v[2]){
		ans=max(ans,1+min(v[2]-1,v[1])*2+v[0]);
	}
	cout<<ans<<endl;
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 4688
final_rank: 5

code_snippet: #include "bits/stdc++.h"

using namespace std;

int N,M,K,L,R,H,W;
//long long int N,M,K,L,R,H,W;

constexpr long long int MOD=1000000007;
//constexpr  int MOD=1000000007;
//constexpr int MOD=998244353;
//constexpr long long int MOD=998244353;

constexpr long double EPS=1e-8;



int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	
	cin>>N;
	vector<int>w(N);
	for(auto &i:w)cin>>i;
	vector<int>v(4);
	for(auto i:w){
		v[i%3]++;
	}
	if(v[0]==N){
		cout<<1<<endl;
		return 0;
	}
	if(v[1]==N){
		cout<<min(3,N)<<endl;
		return 0;
	}
	if(v[2]==N){
		cout<<min(3,N)<<endl;
		return 0;
	}
	int ans=1;
	if(v[1]>=2){
		ans=max(ans,2+min(v[2],v[1]-2)*2+v[0]);
	}
	if(v[1]>=3){
		ans=max(ans,3+min(v[2],v[1]-3)*2+v[0]);
	}
	if(v[2]>=2){
		ans=max(ans,2+min(v[1],v[2]-2)*2+v[0]);
	}
	if(v[2]>=3){
		ans=max(ans,3+min(v[1],v[2]-3)*2+v[0]);
	}
	if(v[1]&&v[2]){
		ans=max(ans,2+min(v[1]-1,v[2]-1)*2+v[0]);
	}
	if(v[1]){
		ans=max(ans,1+min(v[1]-1,v[2])*2+v[0]);
	}
	if(v[2]){
		ans=max(ans,1+min(v[2]-1,v[1])*2+v[0]);
	}
	cout<<ans<<endl;
	return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 4684
final_rank: 4

code_snippet: #include<algorithm>
#include<cassert>
#include<cfloat>
#include<climits>
#include<cmath>
#include<cstring>
#include<deque>
#include<functional>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<unordered_map>
#include<unordered_set>
#include<utility>
#include<vector>

using namespace std;

using lint = long long;
using P = pair<int, int>;
using LLP = pair<long long, long long>;

#define REP(i, x, n) for(int i = (x), i##_len = int(n) ; i < i##_len ; ++i)
#define rep(i, n) for(int i = 0, i##_len = int(n) ; i < i##_len ; ++i)
#define reps(i, n) for(int i = 1, i##_len = int(n) ; i <= i##_len ; ++i)
#define rrep(i, n) for(int i = int(n) - 1 ; i >= 0 ; --i)
#define rreps(i, n) for(int i = int(n) ; i > 0 ; --i)
#define SORT(x) sort((x).begin(), (x).end())
#define SORT_INV(x) sort((x).rbegin(), (x).rend())
#define TWINS(x) cout << ((x) ? "Yay!" : ":(") << endl

constexpr int IINF = (1 << 30) - 1;
constexpr long long LLINF = 1LL << 61;
constexpr double EPS = 1e-8;

constexpr int dx4[] = {1, 0, -1, 0}, dy4[] = {0, 1, 0, -1};
constexpr int dx8[] = {1, 1, 0, -1, -1, -1, 0, 1}, dy8[] = {0, -1, -1, -1, 0, 1, 1, 1};

template<typename T>
bool chmax(T& a, T b, bool equal = false){
    if(a < b || equal && a == b){
        a = b;
        return true;
    }
    return false;
}

template<typename T>
bool chmin(T& a, T b, bool equal = false){
    if(b < a || equal && a == b){
        a = b;
        return true;
    }
    return false;
}

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);

    int n;
    cin >> n;

    vector<int> cnt(3);
    rep(i, n){
        int a;
        cin >> a;
        ++cnt[a % 3];
    }

    // cout << cnt[0] << " " << cnt[1] << " " << cnt[2] << endl;

    int ans = 1;
    if(cnt[1] >= 2){
        if(cnt[2] == cnt[1] - 2){
            ans = n;
        }else if(cnt[2] < cnt[1] - 2){
            chmax(ans, 2 + cnt[2] * 2 + cnt[0] + 1);
        }else{
            chmax(ans, 2 + (cnt[1] - 2) * 2 + cnt[0] + min(2, cnt[2] - cnt[1] + 2));
        }
    }
    if(cnt[2] >= 1){
        if(cnt[2] - 1 == cnt[1]){
            ans = n;
        }else if(cnt[2] - 1 < cnt[1]){
            chmax(ans, 1 + (cnt[2] - 1) * 2 + cnt[0] + 1);
        }else{
            chmax(ans, 1 + cnt[1] * 2 + cnt[0] + min(2, cnt[2] - 1 - cnt[1]));
        }
    }
    if(cnt[1] == 1){
        chmax(ans, 1 + cnt[0]);
    }

    cout << ans << endl;

    return 0;
}
accuracy: 1
time_ms: 10
memory_kb: 3196
final_rank: 1

code_snippet: #include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;

const long double PI = acos(-1);
constexpr long double EPS = 1e-15;
constexpr int inf = 2e9;
constexpr ll INF = 2e18;
constexpr ll MOD = 1e9+7;
constexpr ll MOD1 = 998244353;
typedef pair<ll,ll> P;

//#define all(v) (v).begin(), (v).end()
#define rep(i,a,b) for (int i = (a); i < (b); i++)
#define REP(i,n) rep(i,0,n)
#define sz(s) (s).size()
#define pb push_back
#define fi first
#define se second
//#define mp make_pair

int main(){
    int n;
    cin >> n;
    int cnt[3] = {};
    REP(i,n) {
        int tmp;
        cin >> tmp;
        cnt[tmp%3]++;
    }
    if (cnt[0] == n) {
        cout << 1 << endl;
        return 0;
    }
    int ans;
    if(cnt[1] < cnt[2] - 3){
        ans = cnt[1] * 2 + 3;
    }else if(cnt[1] <= cnt[2] + 3){
        ans = cnt[1] + cnt[2];
    }else{
        ans = cnt[2] * 2 + 3;
    }
    ans += cnt[0];
    cout << ans << endl;
    return 0;
}
accuracy: 1
time_ms: 50
memory_kb: 3104
final_rank: 8