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 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 686 div1

    problem1 link 左括号和右括号较少的一种不会大于20.假设左括号少.设$f[i][mask][k]$表示处理了前$i$个字符,其中留下的字符以$k$开头($k=0$表示'(',$k=1$表 ...

  4. topcoder srm 714 div1

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

  5. topcoder srm 738 div1 FindThePerfectTriangle(枚举)

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

  6. Topcoder SRM 602 div1题解

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

  7. Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串

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

  8. Topcoder SRM 584 DIV1 600

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

  9. TopCoder SRM 605 DIV1

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

随机推荐

  1. caffe编译环境的错误:..build_release/src/caffe/proto/caffe.pb.h:23:35: fatal error: google/protobuf/arena.h: 没有那个文件

    在搭建caffe的环境时出现错误: .build_release/src/caffe/proto/caffe.pb.h:23:35: fatal error: google/protobuf/aren ...

  2. Abandoned country(最小生成树+树形DP)

    #include<bits/stdc++.h> using namespace std; struct node{ int u, v, w, nex; bool gone; node(){ ...

  3. SVN && BeyondCompare

    [1]设置内容 (1)三个步骤对应设置内容 1.1 "D:\Beyond Compare 4\BCompare.exe" %base %mine /title1=%bname /t ...

  4. websocket 群聊单聊

    websocket 介绍 介绍引自 https://segmentfault.com/a/1190000012709475 群聊 from flask import Flask, request, r ...

  5. 51Nod 2020 排序相减

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=2020 思路:排序 水水 #include<iostre ...

  6. [转载]window.location.href的用法(动态输出跳转)

    无论在静态页面还是动态输出页面中window.location.href都是不错的用了跳转的实现方案   javascript中的location.href有很多种用法,主要如下. self.loca ...

  7. python中的logger模块

    logger 提供了应用程序可以直接使用的接口handler将(logger创建的)日志记录发送到合适的目的输出filter提供了细度设备来决定输出哪条日志记录formatter决定日志记录的最终输出 ...

  8. 一起学习在 Ubuntu 上授予和移除 sudo 权限

    如你所知,用户可以在 Ubuntu 系统上使用 sudo 权限执行任何管理任务.在 Linux 机器上创建新用户时,他们无法执行任何管理任务,直到你将其加入 sudo 组的成员.在这个简短的教程中,我 ...

  9. 金九银十跳槽季,程序员面试点解析之Java专场

    前言 近年来Java工程师这个岗位炙手可热,市场需求大,学习Java的人也越来越多,所以IT企业与求职者的选择都比较多,那么IT企业在面试时都会提哪些问题呢.下面为大家分享 Java高级工程师面试阿里 ...

  10. javascript 的01

    javaScript可以实现验证表单.制作特效等功能,JavaScript的目的主要是一下三点: 1 客户端表单验证2 页面动态效果3 jQuery的基础JavaScript是一种描述性语言,也是一种 ...