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. 获取PC硬件硬件序列号,唯一标识一台PC

    用一个库:jydisk.dll  百度说是windows提供的C++标准动态库,很方便使用. 点击连接下载文件,里面有各种语言的调用例子,可直接使用.测试多台机器,结果靠谱.没有遇到获取出来是全零的情 ...

  2. powerdesign、navacat、ER图、uml、类图、时序图

    关于建表和生成实体以及ER图的简便方法 a:用navacat客户端生成简单的ER图,并生成建表sql,执行生成表. b:用powerdesign连接数据库,反向生成带有注释的ER图. c:用ideal ...

  3. arm-cache coherency

    提高一个系统的performance,有两种办法: 1) 不断提高一个core的performance,手段就是不断提高freq,减小Vt,这样都会在增加power(dynamic,leakage) ...

  4. strlen实现

    1.strlen函数. 普通版实现方法, int strlen( char *s) { int length = 0; while(*s++) length++; return length; } 优 ...

  5. Yii Restful api认证

  6. uvalive 4288 Cat Vs. Dog

    题意: 有若干个观看者,要对节目进行投票,每张票一定让一直猫留下,一只狗下场,或者一只狗留下,一只猫下场. 如果某个观看者希望留下的动物下场了,或者希望下场的动物留下了,那么他就会离开. 给出若干个投 ...

  7. MySql 查询表中字段的数据类型

    [1]MySQL中查询某表中字段的数据类型 (1)DESC 表名: (2)DESCRIBE 表名: (3)SHOW COLUMNS FROM 表名: 应用示例: DESC cfg_acct_free_ ...

  8. STL容器vector应用注意事项

    [1]提前分配足够空间以免不必要的重新分配和复制代价 关于vector容器重新分配和复制及析构释放的代价,请参见随笔<STL容器之vector>. 应用示例对比代码如下: #include ...

  9. 开源词袋模型DBow3原理&源码(二)ORB特征的保存和读取

    util里提供了create_voc_step0用于批量生成features并保存,create_voc_step1读入features再生成聚类中心,比较适合大量语料库聚类中心的生成. 提取一张图的 ...

  10. Gibbs Sampling深入理解

    二维Gibbs Sampling算法 Gibbs Sampling是高维概率分布的MCMC采样方法.二维场景下,状态(x, y)转移到(x’, y’),可以分为三种场景 (1)平行于y轴转移,如上图中 ...