TopCoder SRM 536(2012/03/07)
MergersDivOne
貪欲法でも解くことができるが,自信がなかったのでDP.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; import static java.util.Collections.*; public class MergersDivOne{ int INF=1<<28; public double findMaximum(int[] a){ int n=a.length; sort(a); double[] dp=new double[n]; fill(dp, -INF); dp[0]=a[0]; for(int j=1; j<n; j++){ double sum=dp[j-1]; int count=1; for(int i=j; i<n; i++){ sum+=a[i]; count++; dp[i]=max(dp[i], sum/count); } } return dp[n-1]; } }
RollingDiceDivOne
サンプルを20~30個生成して規則を導き出した.
本番では降順でソートしていたが,ソートする必要もない解法だった.
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; import static java.util.Collections.*; public class RollingDiceDivOne{ public long mostLikely(int[] a){ int n=a.length; long left, right; left=1; right=a[0]; for(int j=1; j<n; j++){ long d=right-left+1; if(a[j]<=d){ left+=a[j]; right=left+d-a[j]; }else{ left=left+d+(abs(a[j]-d))/2; if(abs(a[j]-d)%2==0){ right=left; }else{ right=left+1; } } } return left; } }
Result
oo- +0/-0 407.87pts. 121st
1635 -> 1732