解題報告 購物

2022-06-04 02:42:06 字數 3467 閱讀 5392

1. 

題目購物shopping

【問題描述】

小t和小l都很喜歡購物,但是,眾所周知,小t和小l都很懶,因此,在這麼熱的天,他們寧可在**上買東西。現在,貨架上有n件物品,由於小t和小l共用一台電腦,他們決定輪流購買自己喜歡的東西。由於小t和小l的審美完全不同,因此,每件物品

對小t的價值為a_i

,對小l的價值為b_i

。因為小l和小t是好朋友,因此他們在滿足自己利益的時候也會為別人著想。

小t總是會選擇對自己價值最大的物品,如果有多個,則選擇其中對小l價值最小的。

而小l就聰明很多(因為小l會算!= =||),

他總是選擇會使自己最後得到的物品總價值最多的物品,如果有多個,他會選擇使得小l最後得到總價值也最多的物品。

現在,要求聰明的你幫助小l和小t計算按照他們的策略最後分別得到的物品的價值。

【輸入格式】

第一行乙個數n表示物品數。

第二行為「l」或者「t」,表示l或者t

先選取物品。

第三到第n+2行,每行兩個數a_i和b_i

【輸出格式】

一行用空格隔開兩個數p,q分別表示小t和小l最後得到物品的總價值。

【樣例輸入】4t

100 80

70 80

50 80

30 50

【樣例輸出】

170 130

資料範圍:

n<=100

2. 演算法

啊啊,怎麼又是一道語文題。

小t 是貪心,小 l 是動規,合起來還是動規。。。。。。怎麼越講越亂?

不說了,上**。

3. 注意事項

讀題去!

4. **

記憶化搜尋 (作者不詳)

var n,i,j,max,t,k,vt,vl:longint;

hash:array[1..100]of boolean;

a,b:array[1..100]of longint;

f:char;

begin   //記憶化搜尋

assign(input,'shopping.in');reset(input);

assign(output,'shopping.out');rewrite(output);

readln(n);

readln(f);

for i:=1 to n do

readln(a[i],b[i]);

for i:=1 to n do hash[i]:=true;

for i:=1 to n do

begin

if f='t' then

begin

max:=0;t:=maxlongint;

for j:=1 to n do

if hash[j] then

begin

if a[j]=max then

if b[j]

begin

b[j]:=t;

k:=j;

end;

if a[j]>max then

begin

max:=a[j];

t:=b[j];

k:=j;

end;

end;

f:='l';vt:=vt+max;

hash[k]:=false;

end;

if f='l' then

begin

max:=0;t:=maxlongint;

for j:=1 to n do

if hash[j] then

begin

if b[j]=max then

if a[j]

begin

a[j]:=t;

k:=j;

end;

if b[j]>max then

begin

max:=b[j];

t:=a[j];

k:=j;

end;

end;

f:='t';vl:=vl+max;

hash[k]:=false;

endend;

writeln(vt,' ',vl);

close(input);close(output);

end.

dp (魂之輓歌)

program shopping;

var a,b:array[1..101]of longint;

f,g:array[0..101,0..100,0..100]of longint;

m,n,i,j,k,t1,t2,t:longint;

c:char;

function max(a,b:longint):longint;

begin

if a>b then exit(a)

else exit(b);

end;

begin   //dp

assign(input,'shopping.in');reset(input);

assign(output,'shopping.out');rewrite(output);

readln(n);

readln(c);

for i:=1 to n do readln(a[i],b[i]);

for i:=1 to n-1 do

for j:=i+1 to n do

if ((a[i]=a[j])and(b[i]

t:=a[i];a[i]:=a[j];a[j]:=t;

t:=b[i];b[i]:=b[j];b[j]:=t;

end;

if c='l' then

begin

inc(n);

for i:=n downto 2 do

begin

a[i]:=a[i-1];

b[i]:=b[i-1];

end;

a[1]:=0;b[1]:=0;

end;

j:=n div 2;

i:=n-j;

m:=i;n:=j;

for i:=1 to m+n do

for j:=1 to m do

begin

k:=i-j;

if k<0 then continue;

t1:=0;t2:=0;

if j-1>=k then t1:=f[i-1,j-1,k];

if k>0 then t2:=f[i-1,j,k-1]+b[j+k];

f[i,j,k]:=max(t1,t2);

if (t2>=t1)and(k>0) then g[i,j,k]:=g[i-1,j,k-1]

else g[i,j,k]:=g[i-1,j-1,k]+a[j+k];

end;

writeln(g[m+n,m,n],' ',f[m+n,m,n]);

close(input);close(output);

end.

藍橋杯 購物券消費方案 遞迴暴力 解題報告

公司發了某商店的購物券1000元,限定只能購買店中的m種商品。每種商品的 分別為m1,m2,要求程式列出所有的正好能消費完該購物券的不同購物方法。程式輸入 第一行是乙個整數m,代表可購買的商品的種類數。接下來是m個整數,每個1行,分別代表這m種商品的單價 0第一行是乙個整數,表示共有多少種方案 第二...

Block Voting 解題報告

這道題做的有點狼狽,效率不高,差一點就tle的ac了。看status裡的,ac的時間大多數都是0ms的。肯定有乙個更有效率的演算法的。下面說下我的狼狽演算法。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1223 問題描述 求每個party的權值。第i...

Safebreaker 解題報告

又是吉林大學一道acm題目,題目很簡單,直接暴力解決。出處 http acm.jlu.edu.cn joj showproblem.php?pid 1718 問題描述 對乙個給定數0000 9999 根據一系列猜測,判斷這個數是否存在,存在的話,是否唯一 例如 3321,給定數 作出猜測,1223 ...