カメヲラボ

主にプログラミングとお勉強全般について書いてます

Supermarket

http://acm.pku.edu.cn/JudgeOnline/problem?id=1456
スーパーで売り出す商品の、利益と売り出し可能な期間が与えられます。たとえば、

4  50 2  10 1   20 2   30 1

のようなデータなら、4種類の商品で1つ目の商品は利益が50、売り出す期間が(単位を時間とすれば)2時間です。1時間に1つだけ商品を出すとすれば、最初の1時間に利益30の商品、次の1時間に利益50の商品を売り出すと合計の利益は80になります。

7  20 1   2 1   10 3  100 2   8 2
   5 20  50 10

のような入力なら、1時間ごとに利益が20,100,10,50,5の商品を売り出せば、利益の合計は185になります。このように、期間内の売り上げが最大になるように売り出すスケジュールを考えて、その売り上げ合計を答えてください。

売り出し可能な期間が同じもので利益を比較しながら合計すると、たとえば

5 1
8 1
30 2
40 2

のような入力の場合、正しくは30,40と売り出して70が最大であるのに、8,40を選んで48と答えてしまうミスが考えられるので注意が必要でしょう。

int s['~~'],v['~~'];

p(int*a,int*b){return*a>*b?-1:*a<*b;}

main(i,n,t,m)
{
  for(;~scanf("%d",&n);printf("%d\n",m))
  {
    for(i=0;i<n*2;)v[i]=scanf("%d",s+i++);
    qsort(s,n,8,p);
    for(m=i=0;i<n;i++)
      for(t=s[i-~i];v[t]?v[t]=!(m+=s[i*2]):--t;);
  }
}

あと、結構大きな値も含まれているようなのでオーバーフローを防ぐコードにしておかなければならない。割と普通に書いて普通に短縮した感じです。