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. echo 内容显示颜色

    一,字体显示颜色 #字体颜色:30m-37m 黑.红.绿.黄.蓝.紫.青.白str=”要显示的字体“echo -e "\033[30m ${str}\033[0m"      ## ...

  2. MS16-032 漏洞复现

    exploit-db的详情:  https://www.exploit-db.com/exploits/39574/ Windows: Secondary Logon Standard Handles ...

  3. LeetCode83.删除排序链表中的重复的元素

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

  4. Web API 跨域问题

    解决办法: 1.web.config <system.webServer> <handlers> <remove name="ExtensionlessUrlH ...

  5. 【Linux学习十】负载均衡带来tomcat的session不一致问题

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 tomcat7 jdk7 session不一致是指web服务器(tom ...

  6. 电脑已连接wifi的密码查询

    有时候,想登陆自己家的无线网络(尤其朋友来家里突然要连接无线网络),脑子刹那间一片空白想不起来密码,怎么办呢? 其实,我们可以通过电脑来查看网络的密码,现在分享如何在笔记本电脑上查看连接过的无线网络密 ...

  7. DSO安装试运行

    参考DSO初探 其中Pangolin安装的时候could not find GLEW,参考这里 libx11-dev libxmu-dev libglu1-mesa-dev libgl2ps-dev ...

  8. python中__call__()方法的用法

    __call__()的用法 __call__()方法能够让类的实例对象,像函数一样被调用: >>> >>> class A(object): def __call_ ...

  9. flask用宏渲染表单模板时,表单提交后,如果form.validate_on_submit()返回的是false的可能原因

    flask用宏渲染表单模板时,表单提交后,提交的内容符合DataRequired()校验, 但是form.validate_on_submit()返回的是False, 原因可能是表单模板中的<f ...

  10. linux test

    some test .在登录Linux时,一个具有唯一进程ID号的shell将被调用,这个ID是什么(b) A.NID B.PID C.UID C.CID .下面那个用户存放用户密码信息(b) A./ ...