Eまではすんなりだったのだけど。
https://codeforces.com/contest/2104/problem/D
問題
整数列Aが与えられる。
この数列に対し、以下の処理を任意回数行える。
- コインを1枚払い、1要素インクリメントする
- コインを1枚もらい、1要素デクリメントする
ただし初期状態でコインは0枚である。
また、Aの各要素は最終的に2以上でなければならない。
Aが素晴らしいとは、どの2要素も互いに素であることをいう。
Aを素晴らしくできるようにするには、最小何要素残せばよいか。
解法
コインの条件は、処理後のAの総和が、初期状態の総和以下であれば任意に動かせることとする。
ならば、最終的なAは2,3,5,7....と素数が並ぶ形にすればよい。
よって、Aを降順にソートしたとき、同じ個数の素数の和以上となる最大の要素数を求めればよい。
int T,N; ll A[404040]; const int prime_max = 10010101; vector<int> prime; int NP,divp[prime_max]; void cprime() { if(NP) return; for(int i=2;i<prime_max;i++) if(divp[i]==0) { //M[i]=NP; prime.push_back(i); NP++; for(ll j=1LL*i*i;j>=i&&j<prime_max;j+=i) if(divp[j]==0) divp[j]=i; } } void solve() { int i,j,k,l,r,x,y; string s; cprime(); cin>>T; while(T--) { cin>>N; FOR(i,N) cin>>A[i]; sort(A,A+N); reverse(A,A+N); int ok=0; ll SA=0,SB=0; FOR(i,N) { SA+=A[i]; SB+=prime[i]; if(SA>=SB) ok=i+1; } cout<<N-ok<<endl; } }
まとめ
時間的にはすんなり解いてるけど、なんか1ミスもったいないな。