no.3 大富翁
maxingc買來的大富翁遊戲規則有些不一樣。
這是乙個n*n 的方形網格,設其左上角為起點◎,座標為(1,1),x 軸向右為正,y
軸向下為正,每個方格邊長為1,如圖所示。一輛汽車從起點◎出發駛向右下角終點▲,其
座標為(n,n)。在若干個網格交叉點處,設定了油庫,可供汽車在行駛途中加油。汽車在
行駛過程中應遵守如下規則:
(1)汽車只能沿網格邊行駛,裝滿油後能行駛k 條網格邊。出發時汽車已裝滿油,在起
點與終點處不設油庫。
(2)汽車經過一條網格邊時,若其x 座標或y 座標減小,則應付費用b,否則免付費用。
(3)汽車在行駛過程中遇油庫則應加滿油並付加油費用a。
(4)在需要時可在網格點處增設油庫,並付增設油庫費用c(不含加油費用a)。
(5)(1)~(4)中的各數n、k、a、b、c均為正整數,且滿足約束:2 <=n<=100,2<=k<=10;
maxingc讓窄森和暖熊在1s的時間內求出從起點到終點最少的花費。否則就不讓他們今天晚上睡覺。hzoiers,幫幫這些孩子吧!
輸入格式:
檔案的第一行是n,k,a,b,c的值。第二行起是乙個n*n 的0-1 方陣,每行n 個值,至n+1 行結束。方陣的第i 行第j 列處的值為1 表示在網格交叉點(i,j)處設定了乙個油庫,為0 時表示未設油庫。各行相鄰兩個數以空格分隔。
輸出格式:
最小費用。
輸入樣例:
9 3 2 3 6
0 0 0 0 1 0 0 0 0
0 0 0 1 0 1 1 0 0
1 0 1 0 0 0 0 1 0
0 0 0 0 0 1 0 0 1
1 0 0 1 0 0 1 0 0
0 1 0 0 0 0 0 1 0
0 0 0 0 1 0 0 0 1
1 0 0 1 0 0 0 1 0
0 1 0 0 0 0 0 0 0
輸出樣例:
12二維 spfa
。深搜的光榮
tle
掉。。。。。。。
解析神馬的,就不說了,水水的二維 spfa
。。。。。。
好吧,我承認,像這種矩陣路徑的,還加上改變原圖的,我一看到它就想深搜。。。。。。
圖論啊圖論。。。。。
不過注意一點,因為他沒走乙個格都要費油,所以他一定不會走回頭路,所以增設的加油站只能用一次,所以不用改變原圖,所以不用考慮儲存問題,所以 bfs
的優化(二維
spfa
)輕鬆水過。。。。。
** dsqwwe
program dsqwwe;
const
dx:array[1..4] of longint=(0,0,1,-1);
dy:array[1..4] of longint=(1,-1,0,0);
w:array[1..4] of longint=(0,1,0,1);
type
tt=record
x,y,s:longint;
end;
vard:array[1..200000] of tt;
v:array[1..100,1..100,0..10] of boolean;
dis:array[1..100,1..100,0..10] of longint;
closed,open,n,k,a,b,c,x,y,s,i,xx,yy,ss,temp,ans,j:longint;
map:array[1..100,1..100] of longint;
begin
assign(input,'car.in');
reset(input);
assign(output,'car.out');
rewrite(output);
readln(n,k,a,b,c);
for i:=1 to n do
for j:=1 to n do
read(map[i,j]);
closed:=0; open:=1;
d[1].x:=1; d[1].y:=1; d[1].s:=k;
filldword(dis,sizeof(dis)>>2,999999);
dis[1,1,k]:=0;
v[1,1,k]:=true;
while closed<>open do
begin
inc(closed);
if closed>n*n*k then closed:=1;
x:=d[closed].x;
y:=d[closed].y;
s:=d[closed].s;
if s<>0 then
for i:=1 to 4 do
begin
xx:=x+dx[i];
yy:=y+dy[i];
if (xx>0) and (xx<=n) and (yy>0) and (yy<=n) then
begin
temp:=w[i]*b;
if map[xx,yy]=1 then
begin
ss:=k;
temp:=temp+a;
endelse begin
ss:=s-1;
if (ss=0) and ((xx<>n) or (yy<>n)) then
begin
ss:=k;
temp:=temp+c+a;
end;
end;
if dis[xx,yy,ss]>dis[x,y,s]+temp then
begin
dis[xx,yy,ss]:=dis[x,y,s]+temp;
if not v[xx,yy,ss] then
begin
v[xx,yy,ss]:=true;
inc(open);
if open>n*n*k then open:=1;
d[open].x:=xx;
d[open].y:=yy;
d[open].s:=ss;
end;
end;
end;
end;
v[x,y,s]:=false;
end;
ans:=maxlongint;
for i:=0 to k do
if dis[n,n,i]writeln(ans);
close(input);
close(output);
end.
尋找大富翁
015年胡潤研究院的調查顯示,截至2014年9月,個人資產在600萬元以上高淨值人群達290萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入首先給出兩個正整數n 10 6 和 m 1 0 其中 n為總人數,m為需要找出的大富翁數 接下來一行給出 n個人的個人資產值,以百萬元為單...
尋找大富翁
胡潤研究院的調查顯示,截至2017年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入首先給出兩個正整數n 10 6 和 m 1 0 其中 n為總人數,m為需要找出的大富翁數 接下來一行給出 n個人的個人資產值,以百萬元為單位,為不超過...
尋找大富翁
7 16 尋找大富翁 25 分 胡潤研究院的調查顯示,截至2017年底,中國個人資產超過1億元的高淨值人群達15萬人。假設給出n個人的個人資產值,請快速找出資產排前m位的大富翁。輸入首先給出兩個正整數n 10 6 和m 10 其中n為總人數,m為需要找出的大富翁數 接下來一行給出n個人的個人資產值,...