一日1solve
どうもー きゃらっぱーです。きゃっとあっぱーでーす。
waterとか"t"の発音って"r"にかえたらネイティブっぽいよね。わらー。わらーめろん。
そんなことは置いといて。
最近ネタの枯渇で困っているという私のもとに、あるアイデアが思いついた。
「ネタがないなら、精進すればいいじゃない」
私はインスピレーションを感じた。「なんていい言葉だ。持ちネタにしよう」と。
というわけでネタが無いので1日1solve。
自分で問題選んでもあれなんで、AOJのサイトを開いてTOPに出てくるrecent activityのなかで一番上にあるAcceptの問題を解いていきたいと思います。
今回はAOJ0529。
矢が4本っていうのが、ヌルゲー感を醸し出しますが、私は動じない。ヌルゲーだろうとsolveしよう。更新のために。
#include<stdio.h> #include<algorithm> #include<vector> using namespace std; int main(){ int a,b,mato[1000]; vector<int> nums; while(scanf("%d%d",&a,&b),a,b){ int res=0; nums.clear(); for(int i=0;i<a;i++)scanf("%d",mato+i); for(int i=0;i<=a;i++) for(int j=0;j<=a;j++) nums.push_back(mato[i]*!!(i-a)+mato[j]*!!(j-a)); sort(nums.begin(),nums.end()); vector<int>::iterator it=nums.begin(); while(it!=nums.end() && b>=*it){ vector<int>::iterator itt=upper_bound(nums.begin(),nums.end(),b-*it); res=max(res,*it+++*--itt); } printf("%d\n",res); } return 0; }
いやー 気づいたら気持ち悪い式書いてるのは仕様です。
アルゴリズムを平たく言うと、2つづつに分けたのを足すだけです。オーダーはN*N*logNですかね。upper_boundのアルゴリズムは2分探索だと期待しましょう。
そんなに難しくないですね。4つですから。
これ多くなると解けるのでしょうかねー。今度ちょっとやってみますー。