解題報告 大富翁

2022-06-04 02:24:09 字數 3243 閱讀 5823

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個人的個人資產值,...