problem1 link

记录一个模$k$之后的值是否出现过,出现过则出现循环,无解;否则最多$k$ 次一定能出现0.

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class ConcatenateNumber { public int getSmallest(int number, int k) {
if(k==1) {
return 1;
}
boolean[] f=new boolean[k];
final long b=getbase(number);
int cur=0;
for(int i=1;;++i) {
cur=(int)((cur*b+number)%k);
if(cur==0) {
return i;
}
if(f[cur]) {
return -1;
}
f[cur]=true;
}
} long getbase(int x) {
long result=1;
while(x>0) {
result*=10;
x/=10;
}
return result;
}
}

  

problem2 link

最朴素的方法应该是令$f[i][mask]$表示处理前$i$块板子使用的painter的集合是$mask$的最小值,但是这样会超时。

时间上可以接受的方法是二分。首先列举所有可能的时间,然后对时间进行二分。二分之后,令$p[i][j]$表示第$i$个painter从第$j$个board开始能涂到的板子的编号。然后进行动态规划。令$dp[mask]$表示$mask$集合的painter可以涂到的板子的最大编号。

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class PaintingBoards { public double minimalTime(int[] boardLength, int[] painterSpeed) {
final int n=boardLength.length;
final int m=painterSpeed.length;
List<Double> list=new ArrayList<>();
for(int i=0;i<n;++i) {
double cur=0;
for(int j=i;j<n;++j) {
cur+=boardLength[j];
for(int k=0;k<m;++k) {
list.add(cur/painterSpeed[k]);
}
}
}
Collections.sort(list);
int low=0,high=list.size()-1;
int result=high;
while(low<=high) {
int mid=(low+high)>>1;
if(check(list.get(mid),boardLength,painterSpeed)) {
result=Math.min(result,mid);
high=mid-1;
}
else {
low=mid+1;
}
}
return list.get(result);
} boolean check(double mid,int[] board,int[] painter) {
final int n=board.length;
final int m=painter.length;
int[][] p=new int[m][n];
for(int i=0;i<m;++i) {
final double s=mid*painter[i]+1e-10;
for(int j=0;j<n;++j){
double x=0;
int y=j;
while(y<n&&x+board[y]<=s) {
x+=board[y++];
}
p[i][j]=y;
}
}
int[] f=new int[1<<m];
for(int i=1;i<(1<<m);++i) {
for(int j=0;j<m;++j) {
if((i&(1<<j))!=0) {
if(f[i^(1<<j)]==n) {
f[i]=n;
break;
}
f[i]=Math.max(f[i],p[j][f[i^(1<<j)]]);
}
}
}
return f[(1<<m)-1]==n;
} }

  

problem3 link

分两步:

第一步,计算使用$i$个可以拼成的集合$all[i]$,$1 \leq i \leq 10$;

第二步,从$\frac{a}{b}$开始进行逆向搜索,令集合$unall[i]$中的每个元素$x$表示$x$可以和某个$all[i]$中的元素$y$可以组装成$\frac{a}{b}$。

import com.sun.imageio.spi.RAFImageInputStreamSpi;

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class BuildCircuit { static long gcd(long x,long y) {
return y==0?x:gcd(y,x%y);
} static class Rational {
public long p;
public long q; public Rational() {}
public Rational(long x,long y) {
long t=gcd(x,y);
this.p=x/t;
this.q=y/t;
} public static Rational parallel(Rational r1,Rational r2) {
return new Rational(r1.p*r2.p, r1.p*r2.q+r1.q*r2.p);
} public static Rational unparallel(Rational r1,Rational r2)
{
long t=r1.q*r2.p-r1.p*r2.q;
if(t<=0) {
return null;
}
return new Rational(r1.p*r2.p,t);
} public static Rational serial(Rational r1,Rational r2)
{
return new Rational(r1.p*r2.q+r1.q*r2.p,r1.q*r2.q);
} public static Rational unserial(Rational r1,Rational r2)
{
long t=r1.p*r2.q-r1.q*r2.p;
if(t<=0){
return null;
}
return new Rational(t,r1.q*r2.q);
} public boolean equals(Object object) {
Rational t=(Rational)object;
return p==t.p&&q==t.q;
}
public int hashCode() {
return (int)((p*1007+q)%1000000007);
}
} public int minimalCount(int a,int b) {
List<List<Rational>> all=new ArrayList<>();
for(int i=0;i<11;++i) {
all.add(new ArrayList<>());
}
Rational one=new Rational(1,1);
Rational two=new Rational(2,1);
all.get(1).add(one);
all.get(1).add(two);
Map<Rational,Integer> map1=new HashMap<>();
map1.put(one,1);
map1.put(two,1); for(int i=2;i<=10;++i) {
for(int x=1;x<=i-x;++x) {
final int y=i-x;
for(Rational xx:all.get(x)) {
for(Rational yy:all.get(y)) {
mark(map1,Rational.parallel(xx,yy),i,all.get(i));
mark(map1,Rational.serial(xx,yy),i,all.get(i));
}
}
}
} List<List<Rational>> unall=new ArrayList<>();
for(int i=0;i<11;++i) {
unall.add(new ArrayList<>());
}
Rational need=new Rational(a,b);
unall.get(0).add(need);
Map<Rational,Integer> map2=new HashMap<>();
map2.put(need,0);
for(int i=1;i<=10;++i) {
for(int x=0;x<i;++x) {
final int y=i-x;
for(Rational xx:unall.get(x)) {
for(Rational yy:all.get(y)) {
mark(map2,Rational.unparallel(xx,yy),i,unall.get(i));
mark(map2,Rational.unserial(xx,yy),i,unall.get(i));
}
}
}
} int result=17;
for(int i=0;i<=10;++i) {
for(Rational x:unall.get(i)) {
if(map1.containsKey(x)) {
result=Math.min(result,i+map1.get(x));
}
}
}
if(result==17) {
return -1;
}
return result; } void mark(Map<Rational,Integer> map,Rational object,int num,
List<Rational> list) {
if(object==null) {
return;
}
if(map.containsKey(object)) {
return;
}
map.put(object,num);
list.add(object);
}
}

  

topcoder srm 390 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. php 提取多维数组指定列

    前言:有时候在开发中会遇到这样的问题,我们需要把有规律的多维数组按照纵向(列)取出,有下面的方法可用: 我们将拿下面的数组来处理: 1 $arr = array( 2 '0' => array( ...

  2. git 语法

    $ git init  // 初始化一个Git仓库 会生成一个.git目录 $ git status   // 查看仓库的状态 $ git add .   // 将所有修改添加到暂存区 $git ad ...

  3. Android -- 使用WindowManager实现悬浮框效果

    1,原文在这里http://blog.csdn.net/qq_17250009/article/details/52908791,我只是把里面的关键步骤给注释了一下,首先来看一下我们的效果,如图(电脑 ...

  4. talend openstudio 在OracleInput组件中guess Schema 出现Database connection is failed 的错误

    错误描述: talend openstudio 在OracleInput组件中guess Schema 出现Database connection is failed 的错误. 查看错误详情,发现错误 ...

  5. gedit emacs

    emacs常用操作: 1)C-g:退出当前命令 2)C-x C-f:搜索文件打开 3)C-s:向前搜索 C-r:向后搜索 4)C-x 2:水平分割窗口 C-x 3:竖直分割窗口 5)C-x o:切换窗 ...

  6. [5]传奇3服务器源码分析一GameServer

    1. 2. 留存 服务端下载地址: 点击这里

  7. 学习笔记<2>Android基本四大组件

    <1>Activity(活动) ------与用户交互的界面 (1)Activity启动基本流程 <2>service(服务) <3>ContentProvider ...

  8. 18. 4Sum(双指针)

    Given an array nums of n integers and an integer target, are there elements a, b, c, and d in nums s ...

  9. Yii2缓存依赖

  10. 【CDH学习之二】ClouderaManager安装

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 zookeeper-3.4.11 搭建方案:   serve ...