AOJ 0202 At Boss's Expense
AIZU ONLINE JUDGE
Memory Limit : 32768 KBで、整数の集合をset
bitset使ったら大丈夫。
一応、bootの配列もbitsetに置き換えてみたけど、あんまり変わらなかった気がする。(1000KBくらい?)
最終的には、1500KBくらいで通った。
メモリの量は通した人のをみてると、かなりいい感じなほうかも。
ただ、計算に2,3秒かかってる。
一位の人とかどんな実装なんだろな……
#include <iostream> #include <vector> #include <set> #include <algorithm> #include <cmath> #include <bitset> using namespace std; const int MAX = 1000010; bitset<MAX> isPrime; void sieve(){ bitset<MAX> find; int i; for(i=2;i*i < MAX;i++){ if(find[i]) continue; isPrime.set(i); for(int j=i;j<MAX;j++){ if(j%i == 0){ find.set(j); } } } for(;i<MAX;i++){ if(!find[i]) { isPrime.set(i); } } } int main(){ sieve(); while(true){ int n,x; cin >> n >> x; if(n==0 && x==0) return 0; vector<int> R(n); for(int i=0;i<n;i++){ cin >> R[i]; } bitset<MAX> S; S.set(0); for(int i=0;i<R.size();i++){ for(int j=0;j<=x;j++){ if(!S[j]) continue; int newe = j + R[i]; if(newe > x) continue; S.set(newe); } } int maxn = -1; for(int i=0;i<=x;i++){ if(isPrime[i] && S[i]) maxn = i; } if(maxn == -1) cout << "NA" << endl; else cout << maxn << endl; } return 0; }