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 ...