Wikioi 1261 龍王的禮物

http://www.wikioi.com/problem/1261/

繼續搬運。。。

用f[i][j]表示前j個數,取出來一些數,他們的和mod n爲i時,這個和的最大值.num[i][j]表示這個最大值的情況下,取的最少的塊數.a爲原數組,則f[i][j]=max(f[i][j-1], f[ ((i-a[j])%n+n)%n ] + a[j])(分別表示不取此數與取此數),當括號內二者相同時,num從前者的num與後者num+1中最小的一個轉移而來,否則正常轉移.可以使用滾動數組優化空間,否則應該會MLE,數據相當弱,AC並不一定代表代碼是完全正確的,注意邊界問題

Var i,j,n,m,k:longint;
    lastf,lastg,g,f,a:array[0..100000] of int64;
Begin
  readln(n,m);
  Fillchar(g,sizeof(g),byte(-1));
  For i:=1 to m do readln(a[i]);
  g[0]:=0;
  For i:=1 to m do
  Begin
    lastf:=f; lastg:=g;
    For j:=0 to n-1 do
      Begin
        k:=(j+a[i]) mod n;
        If (lastg[j]<>-1) and ((a[i]+lastf[j]>f[k]) or ((a[i]+lastf[j]=f[k]) and (lastg[j]+1<f[k]))) then
        Begin
          f[k]:=a[i]+lastf[j];
          g[k]:=lastg[j]+1;
        End;
      End;
  End;
  If f[0]<>0 then writeln(f[0],' ',g[0]) else writeln('no answer');
  readln;
End.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章