TopCoder SRM 383 Div1 Easy Planks

問題

n本の木の棒がある。それぞれの長さはlengths[i]である。
ここから木の棒を切り出して売りたい。
売る木の棒の長さは整数で、かつ全ての長さが等しくなければならない。


木の切断には一回ごとにcostPerCutの値段がかかる。
長さlの木の棒はl*woodValueの値段で売れる。
余った分は全て捨てる。


最大でいくらの利益を得ることができるか、求めよ。

制約条件

n≦50
lengths[i]≦10000
costPerCut,woodValue≦1000

方針

切り出す棒の長さを1〜10000の全てを試す。
長さを決めたら、それぞれの棒から売る棒が何本取れるのかが分かるので、
切り出せるだけ切り出す。


赤字になる場合は切らないようにする。

ソースコード

class Planks {
  public:
  int makeSimilar(vector <int> lengths, int costPerCut, int woodValue) {
    int ans=0;
    for(int l=1;l<=10000;l++){
      int tmp=0;
      rep(i,lengths.size()){
        int c=(lengths[i]+l-1)/l-1;
        tmp+=max(0,woodValue*(c+(lengths[i]%l==0))*l-c*costPerCut);
      }
      ans=max(ans,tmp);
    }
    return ans;
  }
};