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;
} }

  

topcoder srm 325 div1的更多相关文章

  1. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

  2. Topcoder Srm 726 Div1 Hard

    Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...

  3. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  4. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

    Problem Statement      You are given the ints perimeter and area. Your task is to find a triangle wi ...

  5. Topcoder SRM 602 div1题解

    打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...

  6. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

    Problem Statement      The Happy Letter game is played as follows: At the beginning, several players ...

  7. Topcoder SRM 584 DIV1 600

    思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...

  8. TopCoder SRM 605 DIV1

    604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...

  9. topcoder srm 575 div1

    problem1 link 如果$k$是先手必胜那么$f(k)=1$否则$f(k)=0$ 通过对前面小的数字的计算可以发现:(1)$f(2k+1)=0$,(2)$f(2^{2k+1})=0$,(3)其 ...

随机推荐

  1. Javascript-双色球

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. sql server 中DateName()函数及DatePart()函数

    Datepart():返回代表指定日期的指定日期部分的整数 语法:Datepart(datepart,date)  返回类型:int DateName():返回代表指定日期的指定日期部分的字符串 语法 ...

  3. Memento Mori (二维前缀和 + 枚举剪枝)

    枚举指的是枚举矩阵的上下界,然后根据p0, p1, p2的关系去找出另外的中间2个点.然后需要记忆化一些地方防止重复减少时间复杂度.这应该是最关键的一步优化时间,指的就是代码中to数组.然后就是子矩阵 ...

  4. .net web site 和 web application 的区别

    web application 会把所有的代码编译打包成单一的库文件(.dll). web site 不会对整个的代码进行编译,在运行时须要哪一段代码就编译哪段代码.这导致web site 上线后,如 ...

  5. caffe生成voc格式lmdb

    要训练ssd基本都是在liu wei框架下改,生成lmdb这一关照葫芦画瓢总遇坑,记录之: 1. labelmap_voc.prototxt要根据自己的分类修改,比如人脸检测改成这样: item { ...

  6. Vue 的路由实现 Hash模式 和 History模式

    Hash 模式: Hash 模式的工作原理是onhashchange事件,Window对象可以监听这个事件... 可以通过改变路径的哈希值,来实现历史记录的保存,发生变化的hash 都会被浏览器给保存 ...

  7. 开发vue单页面Demo

    第1步:安装webpack脚手架 npm install webpack -g (全局安装) (新电脑启动npm run dev版本报错,是因为webpack-server版本更新的问题,要安装pac ...

  8. python遍历目录os.walk(''d:\\test2",topdown=False)

    os.walk(top, topdown=True, onerror=None, followlinks=False)遍历目录,topdown=false表示先返回目录,后返回文件 参数说明: top ...

  9. css的优先级 和 权重

    之前写页面样式时,有时会遇到 用多条样式定义规则对同一个元素进行样式设置的时候,当时想到的就是  按css选择器的优先级来搞定这个问题,说实话当时也就只记得 内嵌样式 > id > cla ...

  10. poj1185 [NOI2001炮兵阵地]

    题目链接 状压DP 本来如果考虑所有情况应该开hh[n][2^10][2^10]表示i行在i-1的状态为j,i-2的状态为k的最大个数 但是由于每行中的人互相限制所以在m=10时只有60种情况 空间就 ...