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. HTML-CSS线性渐变

    实现背景的渐变可以通过为背景添加颜色渐变的图片,也可以使用浏览器的功能来为背景添加渐变的颜色 在IE6或IE7浏览器下可以使用一下示例的CSS语句,设置filter属性来实现颜色 filter:pro ...

  2. 【转】LoadRunner压力测试:测试报告结果分析

    见:https://blog.csdn.net/haoui123/article/details/62036723

  3. Apache+Tomcat+Memcached实现会话保持

    会话保持的三种方式 Session sticky会话绑定:通过在前端调度器的配置中实现统一session发送至同一后发端服务器 Session cluster会话集群:通过配置Tomcat保持所有To ...

  4. python type的用法

    目录 描述 语法 用法 type和isinstance Type和Object 描述 python的 type 函数有两个用法,当只有一个参数的时候,返回对象的类型.当有三个参数的时候返回一个类对象. ...

  5. SQL 语法速记

    ----------------------------------DML(数据操作语言)---------------------------------- -- 一.INSERT VALUES语句 ...

  6. 使用NodeJsScan扫描nodejs代码检查安全性

    使用NodeJsScan扫描nodejs代码检查安全性1.下载源码:https://github.com/ajinabraham/NodeJsScan2.下载Windows版docker toolbo ...

  7. Mybatis 在 insert 之后想获取自增的主键 id

    记录一次傻逼的问题, 自己把自己蠢哭:Mybatis 在 insert 之后想获取自增的主键 id,但却总是返回1 错误说明: 返回的1是影响的行数,并不是自增的主键id: 想要获取自增主键id,需要 ...

  8. QXDM操作应用

    QXDM(The QUALCOMM Extensible Diagnostic Monitor)是高通公司(Qualcomm)公司发布的可以对手机终端所发数据进行跟踪有效工具,通过对数据的分析可以诊断 ...

  9. P1012 拼数

    P1012 拼数 输入输出样例 输入样例 3 13 312 343 输出样例 34331213 注意 当你输入: 6321 32 407 135 13 217 应该输出: 40732321217135 ...

  10. python之字符串函数

    1.  endswith()  startswith() # 以什么什么结尾 # 以什么什么开始 test = "alex" v = test.endswith('ex') v = ...