2010-01-17
過去問マラソン(#11):SRM153
過去問マラソン | |
戦闘用ローカルマシンにgitを入れたので、SRM152までのコードを昨日gitでcommit&pushしたつもりだったがディレクトリごと消えていた。git操作ミスか?
過去問マラソン的にはここに全部書いてるからまあいいけど、gitスキル的にやばい…
- *.cppファイルを自分で一括消去してるっぽい。…重複排除しようと思ってgit rmを使ったのを思い出した
TimeMachineが最後にバックアップした1/11の分(※USB足りないのでTimeMachine用1TBHDDは普段は繋いでない)まで覚えててくれました。SRM150の分まで入ってる。TimeMachine++
Easy(250): Inventory
- 問題読んでも全然頭に入ってこないよー
- とりあえずコード書いたけどSample Caseの最後のやつが合わない
- なるほど。有理数演算しないと駄目か。
- 前に書いたはずのFractionクラスのコードを引っ張り出す
- これでどうだ
- 30%ルールに引っかかるお
- いろいろ削って最小限にしないとダメか
- テンプレートとか駄目なのかなあ
- 削った。submit
- failed system test
#define sz(a) int((a).size()) #define pb push_back #define rep(var,n) for(int var=0;var<(n);var++) #define all(c) (c).begin(),(c).end() #define tr(c,i) for(typeof((c).begin()) i=(c).begin(); i!=(c).end(); i++) typedef long long T; T gcd(T m, T n) { if (m == 0 || n == 0) return 0; if (m == 1 || n == 1) return 1; if (m == n) return m; while (1) { if (m == 0) return n; if (n == 0) return m; if (m > n) m %= n; else n %= m; } } class Fraction { T numer, denom; public: Fraction(){ init(0,1); } Fraction(T n, T d=1){ init(n,d); } Fraction(const Fraction& other){ init(other); } Fraction& init(T n, T d); // impl.below Fraction& init(const Fraction& other); // impl.below double value() { if (numer == 0) return 0; if (denom == 1) return (double)numer; return (double)numer / denom; } Fraction& operator+=(const Fraction& other); // impl.below Fraction& operator/=(T n){ return init(numer, denom*n); } }; Fraction& Fraction::init(T n, T d) { if (d < 0) n=-n, d=-d; if (n==0) { numer = 0, denom = 1; } else { T g = gcd(n,d); numer = n / g, denom = d / g; } return *this; } Fraction& Fraction::init(const Fraction& other){ numer = other.numer, denom = other.denom; return *this; } Fraction& Fraction::operator+=(const Fraction& other) { T g = gcd(denom, other.denom), l=denom/g*other.denom;// l=denomm*other.denom/gcd T n = numer*(other.denom/g) + other.numer*(denom/g); return init(n,l); } // class Inventory { public: int monthlyOrder(vector <int> sales, vector <int> daysAvailable) { int n=sz(sales), d=0; Fraction sum; rep(i,n) { //if (sales[i]==0 || daysAvailable[i]==0) continue; if (daysAvailable[i]==0) continue; Fraction expected(sales[i]*30, daysAvailable[i]); sum += expected; d++; } sum /= d; return (int)ceil( sum.value() ); } };
Medium(450):
Easyで時間かけすぎたので後で