問題
http://community.topcoder.com/stat?c=problem_statement&pm=1772&rd=4570
ある製品について、何日間で何個売れるかがわかっている。
複数の製品について上記の情報が与えられたとき、
1カ月あたり、つまり30日あたり平均何個の製品が売れるかを求めたい。
ただし、情報が0日間であったときはその製品はないものとみなす。
また、割りきれない場合は誤差1e-9を引いたのちに繰り上げる。
解き方
実装自体はシンプル。
以下の例外条件をきちんと書けるかがポイント。
・情報が0日間はカウントしない。(売れる数が0個のときはカウント)
・誤差の計算(問題文のとおり、1e-9を引く)
・最後に割り算が来るので、0のときの例外条件を記載
コード
using namespace std;
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class Inventory {
public: int monthlyOrder(vector<int> sales, vector<int> daysAvailable) {
double cnt=0.0,ret=0.0;
FORE(i,0,sales.size()){
if(daysAvailable[i]==0)continue;
ret+=sales[i]*30.0/daysAvailable[i];
cnt++;
}
return cnt==0 ? 0 :(int)(ceil(ret/cnt-1e-9));
}
};
#define all(c) (c).begin(),(c).end()
#define FORE(i,d,e) for(int i=d;i<e;i++)
#define FOR(i,s,e) for (int i = int(s); i != int(e); i++)
#define FORIT(i,c) for (typeof((c).begin()) i = (c).begin(); i != (c).end(); i++)
#define ISEQ(c) (c).begin(), (c).end()
class Inventory {
public: int monthlyOrder(vector<int> sales, vector<int> daysAvailable) {
double cnt=0.0,ret=0.0;
FORE(i,0,sales.size()){
if(daysAvailable[i]==0)continue;
ret+=sales[i]*30.0/daysAvailable[i];
cnt++;
}
return cnt==0 ? 0 :(int)(ceil(ret/cnt-1e-9));
}
};