topcoder srm 325 div1
生活随笔
收集整理的這篇文章主要介紹了
topcoder srm 325 div1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
problem1 link
$g[i]$表示解決前$i$個的代價,那么$g[i]$是所有$g[j]+cost(j+1,i)$的最小值。
import java.util.*; import java.math.*; import static java.lang.Math.*;public class FenceRepairing {public double calculateCost(String[] boards) {StringBuilder builder=new StringBuilder();for(int i=0;i<boards.length;++i) {builder.append(boards[i]);}final String s=builder.toString();final int n=s.length();int[] f=new int[n+1];f[0]=0;for(int i=1;i<=n;++i) {f[i]=f[i-1];if(s.charAt(i-1)=='X') {++f[i];}}double[] g=new double[n+1];g[0]=0;for(int i=1;i<=n;++i) {g[i]=g[i-1];if(f[i]-f[i-1]!=0) {g[i]+=1;}for(int j=0;j<i;++j) {double t=g[j];if(f[i]-f[j]>0) {t+=Math.sqrt(i-j);}if(t<g[i]) {g[i]=t;}}}return g[n];} }problem2 link
分別討論$X$的取值區間即可。
import java.util.*; import java.math.*; import static java.lang.Math.*;public class ModularInequality {public int countSolutions(int[] A, int P) {Arrays.sort(A);int result=0;final int n=A.length;long sum=0;for(int x:A) {sum+=x;}if(sum>=P) {long k=(sum-P+n-1)/n;if(k<A[0]) {result+=A[0]-k;}}else {long k=(sum-P)/n;if(k<A[0]) {result+=A[0]-k;}}if(P+sum>=0) {long k=(P+sum)/n;if(A[n-1]<=k) {result+=k-A[n-1]+1;}}else {long k=(P+sum-(n-1))/n;if(A[n-1]<=k) {result+=k-A[n-1]+1;}}long pre=0;for(int i=1;i<n;++i) {pre+=A[i-1];sum-=A[i-1];if(A[i]==A[i-1]) {continue;}long aa=P-(sum-pre);long bb=i+i-n;if(bb==0) {if(aa>=0) {result+=A[i]-A[i-1];}}else if(bb<0) {long k=-1;if(aa<0) {k=aa/bb;if(aa%bb!=0) {++k;}}else if(aa==0) {k=0;}else {k=aa/bb;}if(k<A[i]) {result+=A[i]-Math.max(A[i-1],k);}}else {long k=-1;if(aa<0) {k=aa/bb;if(aa%bb!=0) {--k;}}else if(aa==0) {k=0;}else {k=aa/bb;}if(A[i-1]<=k) {result+=Math.min(k,A[i]-1)-A[i-1]+1;}}}return result;} }problem3 link
從小到大依次枚舉每個幣種的面值。假設要求的答案為$f(n,K)$。當枚舉第二種面值的時候,假設是2,那么后面所有的面值都是2的倍數,所以此時$f(n,K)=n$%$2+f(\frac{n}{2},K-1)$。
import java.util.*; import java.math.*; import static java.lang.Math.*;public class NewMoneySystem {public long chooseBanknotes(String N,int K) {map=new HashMap<>();return dfs(Long.valueOf(N),K);}static Map<Long,Map<Integer,Long>> map=null;long dfs(long n,int k) {if(k==1) {return n;}if(n==0) {return 0;}Map<Integer,Long> t=map.get(n);if(t==null) {t=new HashMap<>();map.put(n,t);}if(t.get(k)!=null) {return t.get(k);}long result=-1;for(int i=2;i<=5;++i) {long tmp=n%i+dfs(n/i,k-1);if(result==-1||result>tmp) {result=tmp;}}t.put(k,result);return result;}}
轉載于:https://www.cnblogs.com/jianglangcaijin/p/7450441.html
總結
以上是生活随笔為你收集整理的topcoder srm 325 div1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Python】Python 过滤列表
- 下一篇: 【压缩率3000%】上交大ICCV:精度