10月1日水題記錄

來源:互聯網
上載者:User

 

學校神奇地給了7天假,又可以刷一陣子題了,happy

第一天嘛,就隨便做了幾道水題了

 

昂貴的聘禮:枚舉等級最小的點再最短路就可以了

 

釘子與小球:題目本身是超級水的。但有個細節需注意,給兩個分數通分相加時,要先約掉一點,不然就會爆int64

     假設a/b+c/d=e/f,令k=gcd(b,d),那麼e=a*d div k+c*b div k ,f=b div k*d,再對e、f約分這樣才不會215

 

pku1552:超級水題

 

pku1742:可以看成物品數量有限制的完全背包吧,處理每個物品的時候,轉移時帶個輔助數組g[j]表示拼出j這個價值用了幾個該物品。可是本題十分噁心地需要卡常數才不會tle,for j=1 to m會超,改成for j=c[i] to m才行

 

pku2983-差分約束系統(bellman-ford比spfa還快。。)對於P A B X,連(A,B,-X)和(B,A,X),對於V A B,連(X,Y,-1),再判有沒有負權環就可以了,spfa的話特別要注意,可能有V 1 1這樣子的資訊,所以取出隊首時,要先把隊首那個點的進隊標記去掉才判得出這種情況

 

pku2186-求強連通分量縮點,看最低強連通分量(就是出度為0的),如果有多個,那就輸0,如果只有1個,就輸出這個分量包含的點個數

感覺我縮點那裡好像編醜了點。。

 

pku1112(分類練習題dp之分組):題解見http://www.cppblog.com/linyangfei/archive/2008/08/08/58295.htm

    太巧妙了,就是自己想不到。一點總結:這題無非就是想快速得出兩個點能不能被分到同一組中,然後就能利用反圖的性質設計dp演算法來求解了。構造解有點噁心,我卡了好久。。

這題貼個代碼吧,雖然慢了點:

program syj; {dp+tulun_shenqi}<br />const maxn=105;<br />var n,i,j,k,p:longint;<br /> a:array[1..maxn]of longint;<br />// b:array[1..2]of longint;<br /> c:array[1..maxn,1..2,0..maxn]of longint;<br /> u:array[1..maxn,1..maxn]of boolean;<br /> g,gg:array[1..maxn,-maxn..maxn]of longint;<br /> f:array[0..maxn,-maxn..maxn]of boolean;<br /> ans:array[1..2,0..maxn]of longint;<br />procedure dfs(i,t:longint);<br />var k:longint;<br />begin<br /> a[i]:=t; //inc(b[t]);<br /> inc(c[p,a[i],0]);c[p,a[i],c[p,a[i],0]]:=i;<br /> for k:=1 to n do if u[i,k] or u[k,i] then<br /> if a[k]=0 then dfs(k,3-t)<br /> else if 3-t<>a[k] then begin<br /> writeln('No solution');<br /> close(input);close(output);<br /> halt;<br /> end;<br />end;<br />begin<br /> assign(input,'teams.in');reset(input);<br /> assign(output,'teams.out');rewrite(output);<br /> readln(n);<br /> fillchar(u,sizeof(u),1);<br /> for i:=1 to n do u[i,i]:=false;<br /> for i:=1 to n do begin<br /> read(j);<br /> while j<>0 do begin<br /> u[i,j]:=false;read(j);<br /> end;<br /> end;<br /> f[0,0]:=true;<br /> for i:=1 to n do if a[i]=0 then begin<br /> {b[1]:=0;b[2]:=0;} inc(p);<br /> dfs(i,1);<br /> k:=c[p,1,0]-c[p,2,0];<br /> for j:=-n to n do<br /> if (j+k>=-n)and(j+k<=n)and f[p-1,j+k] then begin<br /> f[p,j]:=true; g[p,j]:=k;gg[p,j]:=2;<br /> end else<br /> if (j-k>=-n)and(j-k<=n)and f[p-1,j-k] then begin<br /> f[p,j]:=true; g[p,j]:=-k;gg[p,j]:=1;<br /> end else f[p,j]:=false;<br /> end;<br /> for i:=0 to n do if f[p,i] or f[p,-i] then break;<br /> if not f[p,i] then i:=-i;<br /> while p>0 do begin<br /> k:=gg[p,i];<br /> for j:=1 to c[p,k,0] do begin<br /> inc(ans[1,0]);ans[1,ans[1,0]]:=c[p,k,j];<br /> end;<br /> k:=3-k;<br /> for j:=1 to c[p,k,0] do begin<br /> inc(ans[2,0]);ans[2,ans[2,0]]:=c[p,k,j];<br /> end;<br /> i:=i+g[p,i]; dec(p);<br /> end;<br /> write(ans[1,0]);<br /> for i:=1 to ans[1,0] do write(' ',ans[1,i]);<br /> writeln;<br /> write(ans[2,0]);<br /> for i:=1 to ans[2,0] do write(' ',ans[2,i]);<br /> writeln;<br /> close(input);<br /> close(output);<br />end.<br /> 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.