problem1 link

直接按照题意模拟即可。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class UnfairDivision {public int albertsShare(int[] assets) {final int n=assets.length;for(int i=1;i<n;++i) {assets[i]+=assets[i-1];}int result=0;for(int i=0;i<n-1;++i) {int betty=0,carla=0,albert=0;for(int j=0;j<n-1;++j) {if(j==i) {continue;}int[] a=new int[3];if(j<i) {a[0]=assets[j];a[1]=assets[i]-assets[j];a[2]=assets[n-1]-assets[i];}else {a[0]=assets[i];a[1]=assets[j]-assets[i];a[2]=assets[n-1]-assets[j];}Arrays.sort(a);if(a[1]>betty||a[1]==betty&&a[2]>carla) {carla=a[2];betty=a[1];albert=a[0];}}result=Math.max(result,albert);}return result;}
}

problem2 link

$f[a][b][c][d]$表示将第一个串的$[a,b]$以及第二个串的$[c,d]$拿出来能否拼成一个回文串。每次扩展有四种情况:

(1)第一个串两端相等,那么只需判断$f[a+1][b-1][c][d]$即可;

(2)第一个串的左侧和第二个串右侧相等,只需判断$f[a+1][b][c][d-1]$即可;

(3)第二个串的左侧和第一个串的右侧相等,只需判断$f[a][b-1][c+1][d]$即可;

(4)第二个串左右相等,那么只需判断$f[a][b][c+1][d-1]$即可。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class InterleavePal {final static int INF=99999;int n,m;int[][][][] f=null;String S,T;boolean[][] gs=null;boolean[][] gt=null;boolean check(String s,int ll,int rr)  {while(ll<rr) {if(s.charAt(ll)!=s.charAt(rr)) {return false;}++ll;--rr;}return true;}int dfs(int l1,int r1,int l2,int r2) {if(l1>r1) {if(l2>r2) return 0;if(gt[l2][r2]) return r2-l2+1;return -INF;}if(l2>r2) {if(gs[l1][r1]) return r1-l1+1;return -INF;}if(f[l1][r1][l2][r2]!=-1) {return f[l1][r1][l2][r2];}int result=-INF;if(l1<r1&&S.charAt(l1)==S.charAt(r1)) {result=Math.max(result,2+dfs(l1+1,r1-1,l2,r2));}if(S.charAt(l1)==T.charAt(r2)) {result=Math.max(result,2+dfs(l1+1,r1,l2,r2-1));}if(T.charAt(l2)==S.charAt(r1)) {result=Math.max(result,2+dfs(l1,r1-1,l2+1,r2));}if(l2<r2&&T.charAt(l2)==T.charAt(r2)) {result=Math.max(result,2+dfs(l1,r1,l2+1,r2-1));}f[l1][r1][l2][r2]=result;return result;}public int longestPal(String s, String t) {n=s.length();m=t.length();if(n==0&&m==0) {return 0;}S=s;T=t;f=new int[n][n][m][m];int result=0;gs=new boolean[n][n];for(int i=0;i<n;++i) {for(int j=i;j<n;++j) {if(check(S,i,j)) {gs[i][j]=check(S,i,j);if(gs[i][j]) {result=Math.max(result,j-i+1);}}}}gt=new boolean[m][m];for(int i=0;i<m;++i) {for(int j=i;j<m;++j) {if(check(T,i,j)) {gt[i][j]=check(T,i,j);if(gt[i][j]) {result=Math.max(result,j-i+1);}}}}if(n==0||m==0) {return result;}for(int i=0;i<n;++i) {for(int j=i;j<n;++j) {for(int k=0;k<m;++k) {for(int p=k;p<m;++p) {f[i][j][k][p]=-1;}}}}for(int i=0;i<n;++i) {for(int j=i;j<n;++j) {for(int k=0;k<m;++k) {for(int p=k;p<m;++p) {result=Math.max(result,dfs(i,j,k,p));}}}}return result;}
}

problem3 link

首先,对于指数是偶数的情况来说,会产生重复,比如$x^{12}=(x^{3})^{4}=(x^{6})^{2}$。因此,只计算指数为素数时可避免这种情况;

其次,$(x^{3})^5=(x^{5})^{3}$。这种情况下,只计算指数较小者。所以在计算到指数为较大的素数时,比如11,假设最大值为$t$,即$t^{11}\leq n,(t+1)^{11}>n$.那么要判断有多少数字$u$满足$u^{k}\leq t$,其中$k<11$。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class PowerCollector {boolean isprime(int k) {for(int i=2;i*i<=k;++i) {if(k%i==0) {return false;}}return true;}long get(long a,int b,long n) {long t=1;for(int i=0;i<b;++i) {if(t>n/a) {return n+1;}t*=a;}return t;}long getMax(long n,int k) {long low=1,high=n;long result=1;while(low<=high) {long M=(low+high)>>1;if(get(M,k,n)>n) {high=M-1;}else {result=Math.max(result,M);low=M+1;}}return result;}long dfs(long n,int k) {long result=1;for(int i=2;i<k;++i) {if(!isprime(i)) {continue;}long t=getMax(n,i);if(t==1) {break;}result+=t-dfs(t,i);}return result;}public String countPowers(String N) {long n=Long.valueOf(N);if(n==1) {return "1";}return String.valueOf(dfs(n,62));}
}

  

topcoder srm 305 div1相关推荐

  1. topcoder srm 714 div1

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

  2. topcoder srm 686 div1 -3

    1.给出只包含'(',')','[',']'的字符串$s$,删除一些字符,使得剩下的是合法的括号.有多少种删除方法? $|s|\leq 40$ 思路:左括号和右括号较少的一种不会大于20.假设左括号少 ...

  3. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  4. topcoder srm 706 div1

    1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...

  5. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  6. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...

  7. topcoder srm 360 div1

    problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...

  8. topcoder srm 635 div1

    problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...

  9. topcoder srm 495 div1

    problem1 link 从前向后确定一下,然后再从后向前确定一下.一样的话就是可以确定的. problem2 link 首先将强连通分量缩点.理论上来说,只需要遍历所有入度为0的联通块中的一个即可 ...

最新文章

  1. 运营人,你敢转发给你老板看吗?
  2. jqgrid mvc_jqGrid,REST,AJAX和Spring MVC集成
  3. python discuz搜索api_python如何模拟搜索引擎分词
  4. linux修改ip配置文件路径,Centos7系统如何修改IP地址
  5. c/c++ linux 进程 fork wait函数
  6. MySQL 大数据量分页性能优化
  7. Java中this、super的用法(2)
  8. Axure RP--快捷键大全(常用快捷键)
  9. Ubuntu下逻辑坏道解决方案
  10. markdown在前端的简单使用
  11. 2020华为杯数学建模总结
  12. Png图片换色的方法
  13. 百度网盘网页端视频倍速方法
  14. Ubuntu Linux 安装 QQ音乐打不开的问题
  15. 百度首次元宇宙里开大会,李彦宏:智能交通将使5年内一线城市不再限购限行...
  16. gmtime ()函数
  17. 10. 从0学ARM-基于Exynos4412的pwm详解
  18. Trunk端口的配置
  19. 鼠标双击测试r软件,R.A.T7蜕变版游戏鼠标使用测试_Mad Catz R.A.T.7蜕变版激光游戏鼠标_键鼠评测-中关村在线...
  20. RLC串联电路的一些形象化的结算

热门文章

  1. 关闭防火墙_从零开始学Linux运维|09.关闭防火墙和SElinux
  2. 最大后验估计_PR Ⅱ:贝叶斯估计/推断及其与MAP的区别
  3. 最大流自用模板(例题:HDU1532)
  4. 从头认识Spring-1.7 如何通过属性注入Bean?(1)-如何通过属性向对象注入值?...
  5. 常用类回顾之(String类)
  6. 安卓UI测试(基于android studio环境 espresso框架)
  7. 修改6S Fortran77 代码,建立查找表
  8. SharePoint文档上传管理
  9. 动态添加ContextMenuStrip项(ToolStripItem)
  10. 影响员工敬业度的三大因素