problem1
直接按照题意模拟即可。
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;ibetty||a[1]==betty&&a[2]>carla) { carla=a[2]; betty=a[1]; albert=a[0]; } } result=Math.max(result,albert); } return result; }}
problem2
$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(llr1) { 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
problem3
首先,对于指数是偶数的情况来说,会产生重复,比如$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 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