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. JavaScript-年月日转换12小时制

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  2. Abp项目构建、swagger及代码生成器

    前段时间在学习abp,在配置swagger时踩了不少坑,特此整理一下,方便同行参考.幸运的是又发现了神奇的代码生成器,分享下亲身经验. 觉得此博客非常有用的朋友可以在右侧赞助打赏下,非常感谢大家支持. ...

  3. python socket编程笔记

    用python实现一个简单的socket网络聊天通讯 (Linux --py2.7平台与windows--py3.6平台) 人生苦短之我用Python篇(socket编程) python之路 sock ...

  4. 20155228 2016-2017-2 《Java程序设计》第3周学习总结

    20155228 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 认识对象 类与对象 类和对象的关系:类是对象的设计图,对象是类的实例 参考:将"名 ...

  5. this上下文一致

    什么是this对象 先来说说什么是this对象吧,每个函数在调用的时候都会自动获取两个特殊变量:this和arguments对象.this值具体是指哪个对象是和该函数的执行环境相关的.如果是作为对象的 ...

  6. 【impala学习之一】impala

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 CM5.4 一.ImpalaImpala是基于Hive的大数 ...

  7. 仿照admin的stark自定义组件的功能实现

    仿照admin的stark自定义组件的功能实现:其中最主要的就是增删改查的实现 1.查:首先页面中显示表头和数据,都是动态的,而不是写死的. (1) 先看表头和表单数据:这个是查看的视图函数,但是为了 ...

  8. 批量下载网站图片的Python实用小工具(下)

    引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...

  9. WIN7系统怎样增加C盘空间

    具体操作参考:https://jingyan.baidu.com/article/215817f78e05c01eda142385.html

  10. linux常用命令:rmdir 命令

    今天学习一下linux中命令: rmdir命令.rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的.(注意,rm - r dir命令可代替rmdir,但是有很大危险性.)删 ...