多米诺骨牌-SSL 1632

    xiaoxiao2021-03-25  80

    Description Input   输入文件的第一行是一个正整数n(1≤n≤1000),表示多米诺骨牌数。接下来的n行表示n个多米诺骨牌的点数。每行有两个用空格隔开的正整数,表示多米诺骨牌上下方块中的点数a和b,且1a,b≤6。 Output   输出文件仅一行,包含一个整数。表示求得的最小旋转次数。 Sample Input 4 6 1 1 5 1 3 1 2 Sample Output 1 题解:这道题用dp,f[i]表示最小的旋转速度。 if f[i]<>f[-10000] then break; if f[-i]<>f[-10000] then break; var f:array[-10000..10000] of longint; n,i,j,sum,suma,sumb:longint; a,b:array[1..1000] of longint; function min(a,b:longint):longint; begin if a<b then exit(a) else exit(b); end; begin readln(n); for i:=1 to n do readln(a[i],b[i]); for i:=1 to n do suma:=suma+a[i]; for i:=1 to n do sumb:=sumb+b[i]; for i:=1 to n do sum:=sum+a[i]+b[i]-min(a[i],b[i]); fillchar(f,sizeof(f),127); f[suma-sumb]:=0; for i:=1 to n do begin if a[i]>b[i] then for j:=-sum to sum do f[j]:=min(f[j],f[j+2*(a[i]-b[i])]+1); if a[i]<b[i] then for j:=sum downto -sum do f[j]:=min(f[j],f[j+2*(a[i]-b[i])]+1); end; for i:=0 to sum do begin if f[i]<>f[-10000] then break; if f[-i]<>f[-10000] then break; end; writeln(min(f[i],f[-i])); end.
    转载请注明原文地址: https://ju.6miu.com/read-13661.html

    最新回复(0)