jzoj 1420. 佳餚

Description

  佳餚就是非常美味的菜的意思,佳餚最關鍵的是選擇好原料。
  現在有N種原料,每種原料都有酸度S和苦度B兩個屬性,當選擇多種原料時,總酸度爲每種原料的酸度之積,總苦度爲每種原料的苦度之和。
  正如大家所知,佳餚是既不酸也不苦的,因爲要保證所選的原料使得總酸度和總苦度差的絕對值最小。
  由於佳餚不能只有水,所以必須至少選擇一種佳餚。

Input

  輸入第一行包含一個整數N(1<=N<=10),表示原料的種數。
  接下來N行每行包含兩個用一個空格隔開的整數,分別表示酸度和苦度。
  輸入數據保證如果所有原料都選上,總酸度和總苦度不會超過10^9。

Output

  輸出總酸度和總苦度最小的差。

Sample Input

輸入1:
1
3 10

輸入2:
2
3 8
5 8

輸入3:
4
1 7
2 6
3 8
4 9

Sample Output

輸出1:
7

輸出2:
1

輸出3:
1

Data Constraint

Hint

【樣例解釋】
  樣例3中選擇最後三種原料,這樣總酸度爲2×3×4=24,總苦度爲6+8+9=23,差爲1。

正解

因爲N<=10,所以可以枚舉所有的情況,對總酸度和總苦度的差的絕對值取min就可以啦。(這種良心數據要珍惜啊)

可以用一個類似狀壓/dfs做

CODE

dfs版

var
        n,i,j,ans:longint;
        a,b:array[1..10] of longint;
procedure dfs(pick,dep,x1,x2:longint);
begin
        if dep=n then
        begin
                if (abs(x1-x2)<ans) and (pick>0) then ans:=abs(x1-x2);
                exit;
        end;
        dfs(pick,dep+1,x1,x2);
        dfs(pick+1,dep+1,x1*a[dep+1],x2+b[dep+1]);
end;
begin
        readln(n);
        for i:=1 to n do
                readln(a[i],b[i]);
        ans:=maxlongint;
        dfs(0,0,1,0);
        writeln(ans);
end.

類似狀壓版

uses math;
var
        tot,n,i,j,s:longint;
        sums,sumk,ans:int64;
        x,y,b:array[0..20]of longint;
        pow:array[0..20]of int64;
begin
        readln(n);
        pow[0]:=1;
        for i:=1 to n do begin
                readln(x[i],y[i]);
                pow[i]:=pow[i-1]*2;
        end;
        ans:=maxlongint;
        for i:=1 to pow[n]-1 do begin
                j:=i;
                tot:=0;
                sums:=1;sumk:=0;
                while j<>0 do begin
                        s:=j mod 2;
                        inc(tot);
                        b[tot]:=s;
                        j:=j div 2;
                end;
                for j:=1 to tot do begin
                        if b[j]=1 then begin
                                sums:=sums*x[j];
                                sumk:=sumk+y[j];
                        end;
                end;
                ans:=min(ans,abs(sums-sumk));
        end;
        writeln(ans);
end.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章