problem1 link

二分答案,然后计算总时间。跟$T$比较确定要增大答案还是减小答案。

problem2 link

可以看作是以‘*’所在位置为根的树。所以每个非根节点都有一个父节点。

那么每个非根结点$x$都可以表示其根结点$y$的函数,,类型为$x=p+qy$。比如说有三个节点$x,y,z$,$y$是$x$的父节点,$z$是$y$的父节点,那么有$x=1+y,y=1+\frac{1}{2}(x+z)=1+\frac{1}{2}(1+y+z)\rightarrow y=3+z$。也就是说,这可以从每个叶子结点自底向上从而确定每个节点与其父节点的函数关系。

最后由于根结点的值为0,然后自顶向下可以确定每个节点的值。

problem3 link

首先,假设$n=500$时,squaer-free数字大约有$m\approx 300$个,所以$K$大于$m$时,可以直接令$K=m$。

其次,当一个质数$t>\sqrt{500}=22.3$时,如果它是某一个squaer-free的质因子,那么它一定是这个squaer-free 最大的质因子。而小于$22$的质因子只有8个$(2,3,5,7,11,13,17,19)。

所以可以进行动态规划。首先将所有的squaer-free数字按照即其最大质因子升序排序。$f(i,mask,k,flag)$表示已经已经考虑了前$i$个squaer-free数字,含有的小于$22$的质因子的状态为$mask$,含有的大于$22$的质因子的最大一个质因子的状态为$tag$(=0 or 1),已经选择了$k$个的方案数。

那么对于每次新选择的一个数字$t$,其含有的小于$22$的质因子状态$m_{t}$&$mask$应该等于0,同时假设其含有的最大质因子大于$22$,那么上一个选择的数字含有的最大质因子应该小于$t$含有的最大质因子。

code for problem1

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class IncredibleMachine { public double gravitationalAcceleration(int[] x, int[] y, int T) {
double low=0,high=100000;
for(int i=0;i<100;++i) {
double mid=(low+high)*0.5;
if(cal(mid,x,y)>T) {
low=mid;
}
else {
high=mid;
}
}
return low;
}
double cal(double g,int[] x,int[] y) {
double v=0;
double t=0;
for(int i=1;i<x.length;++i) {
double[] tmp=get(v,g,x[i-1],y[i-1],x[i],y[i]);
t+=tmp[0];
v+=tmp[1]*tmp[0];
}
return t;
}
double[] get(double v0,double g,int x0,int y0,int x1,int y1) {
double d=Math.sqrt((x0-x1)*(x0-x1)+(y0-y1)*(y0-y1));
double a=g*((y0-y1)/d);
double t=Math.sqrt((v0*v0+2*d*a)/(a*a))-v0/a;
return new double[]{t,a};
}
}

  

code for problem2

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class MazeWandering { static class FatherInfo {
double fx,fy;
double p,q; FatherInfo() {}
FatherInfo(int fx,int fy,double p,double q) {
this.fx=fx;
this.fy=fy;
this.p=p;
this.q=q;
}
} double[][] result=null;
FatherInfo[][] fatherInfos=null;
String[] maze=null;
int n,m;
int[] dx={0,0,1,-1};
int[] dy={1,-1,0,0};
int tx,ty; public double expectedTime(String[] maze) {
this.maze=maze;
n=maze.length;
m=maze[0].length();
result=new double[n][m];
fatherInfos=new FatherInfo[n][];
for(int i=0;i<n;++i) {
fatherInfos[i]=new FatherInfo[m];
}
tx=-1;
for(int i=0;i<n&&tx==-1;++i) {
for(int j=0;j<m&&tx==-1;++j) {
if(maze[i].charAt(j)=='*') {
tx=i;
ty=j;
}
}
} fatherInfos[tx][ty]=new FatherInfo(-1,-1,0,0); for(int i=0;i<4;++i) {
int xx=tx+dx[i];
int yy=ty+dy[i];
if(check(xx,yy)) {
dfs(xx,yy,tx,ty);
}
}
Queue<Integer> queue=new LinkedList<>();
queue.offer(tx*100+ty);
result[tx][ty]=0;
while(!queue.isEmpty()) {
int x=queue.peek()/100;
int y=queue.peek()%100;
queue.poll();
for(int i=0;i<4;++i) {
int xx=x+dx[i];
int yy=y+dy[i];
if(check(xx,yy)&&(xx!=fatherInfos[x][y].fx||yy!=fatherInfos[x][y].fy)) {
result[xx][yy]=fatherInfos[xx][yy].p+fatherInfos[xx][yy].q*result[x][y];
queue.offer(xx*100+yy);
}
}
} double sum=0;
int cnt=0;
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
if(maze[i].charAt(j)!='X') {
sum+=result[i][j];
++cnt;
}
}
}
return sum/cnt;
}
boolean check(int xx,int yy) {
return xx>=0&&xx<n&&yy>=0&&yy<m&&maze[xx].charAt(yy)=='.';
}
double[] dfs(int x,int y,int fx,int fy) {
List<double[]> list=new ArrayList<>();
for(int i=0;i<4;++i) {
int xx=x+dx[i];
int yy=y+dy[i];
if(check(xx,yy)&&(xx!=fx||yy!=fy)) {
list.add(dfs(xx,yy,x,y));
}
}
if(list.size()==0) {
fatherInfos[x][y]=new FatherInfo(fx,fy,1,1);
return new double[]{1,1};
}
double p=0,q=0;
for(int i=0;i<list.size();++i) {
p+=list.get(i)[0];
q+=list.get(i)[1];
}
double r0=(1+list.size()+p)/(1+list.size()-q);
double r1=1.0/(1+list.size()-q);
fatherInfos[x][y]=new FatherInfo(fx,fy,r0,r1);
return new double[]{r0,r1};
}
}

  

code for problem3

import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class SquareFreeSets { static final int MOD=1000000007;
List<Integer> primes=new ArrayList<>(); public int countPerfect(int N, int K) { for(int i=2;i<=N;++i) {
if(isPrime(i)) {
primes.add(i);
}
} List<Integer> all=new ArrayList<>();
List<Integer> bitmask=new ArrayList<>();
int[] maxPrime=new int[N+1];
for(int i=2;i<=N;++i) {
if(check(i)) {
all.add(i);
maxPrime[i]=calMaxPrime(i); }
} Collections.sort(all, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if(maxPrime[o1]<maxPrime[o2]) {
return -1;
}
if(maxPrime[o1]==maxPrime[o2]) {
return o1<o2?-1:1;
}
return 1;
}
}); for(int i=0;i<all.size();++i) {
bitmask.add(getBitmask(all.get(i)));
} int[][][][] f=new int[2][1<<8][K+1][2];
int pre=0;
int cur=1;
f[0][bitmask.get(0)][1][0]=1;
f[0][0][0][0]=1;
for(int i=1;i<all.size();++i) {
for(int x=0;x<(1<<8);++x) {
for(int y=0;y<K+1;++y) {
for(int z=0;z<2;++z){
f[cur][x][y][z]=0;
}
}
}
for(int j=0;j<(1<<8);++j) {
for(int k=0;k<K+1;++k) {
for(int t=0;t<2;++t) {
final int v=f[pre][j][k][t];
if(v==0) {
continue;
} int newt=(maxPrime[all.get(i)]!=maxPrime[all.get(i-1)]||maxPrime[all.get(i)]<20)?0:t;
f[cur][j][k][newt]+=v;
if(f[cur][j][k][newt]>=MOD) {
f[cur][j][k][newt]-=MOD;
} if(t==1&&maxPrime[all.get(i)]>20&&maxPrime[all.get(i)]==maxPrime[all.get(i-1)]) {
continue;
}
if((bitmask.get(i)&j)!=0) {
continue;
}
if(k+1>K) {
continue;
}
newt=maxPrime[all.get(i)]>20?1:0;
f[cur][j|bitmask.get(i)][k+1][newt]+=v;
if(f[cur][j|bitmask.get(i)][k+1][newt]>=MOD) {
f[cur][j|bitmask.get(i)][k+1][newt]-=MOD;
}
}
}
}
pre^=1;
cur^=1;
}
int result=0;
for(int j=0;j<(1<<8);++j) {
for(int k=1;k<=K;++k) {
for(int t=0;t<2;++t) {
result+=f[pre][j][k][t];
if(result>=MOD) {
result-=MOD;
}
}
}
}
return result;
} int getBitmask(int x) {
int result=0;
if(x%2==0) {
result|=1;
}
if(x%3==0) {
result|=2;
}
if(x%5==0) {
result|=4;
}
if(x%7==0) {
result|=8;
}
if(x%11==0) {
result|=16;
}
if(x%13==0) {
result|=32;
}
if(x%17==0) {
result|=64;
}
if(x%19==0) {
result|=128;
}
return result;
} int calMaxPrime(int x) {
for(int i=primes.size()-1;i>=0;--i) {
if(x%primes.get(i)==0) {
return primes.get(i);
}
}
return 1;
} boolean isPrime(int x){
for(int i=2;i*i<=x;++i) {
if(x%i==0) {
return false;
}
}
return true;
} boolean check(int x) {
for(int i=0;primes.get(i)*primes.get(i)<=x;++i) {
if(x%primes.get(i)==0&&x%(primes.get(i)*primes.get(i))==0) {
return false;
}
}
return true;
}
}

  

topcoder srm 440 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. 学习笔记: ES7(ES2016)新功能

    ES7添加了两个新功能 : 1. Array.prototype.includes() 2. 指数运算符 1 .Array.prototype,includes() 判断指定的元素是否存在于数组中,  ...

  2. java详解内部类

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一个非常有用的特性但又比较难理解使用的特性(鄙人到现在都没有怎么使用过内部类,对内部类也只是略知一二). 第一次见面 内部类我们从外面 ...

  3. Android -- 自定义ViewGroup实现FlowLayout效果

    1,在开发的时候,常在我们的需求中会有这种效果,添加一个商品的一些热门标签,效果图如下: 2,从上面效果可以看得出来,这是一个自定义的ViewGroup,然后实现换行效果,让我们一起来实现一下 自定义 ...

  4. 删除(unfork)github中某个库(repository)

    1.头像->your profile 2.点击某个想要删除的库,出现界面: 3.点击setting,鼠标滚动页面至末尾,出现页面: 4.点击delete this repository: OK!

  5. POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解

    http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...

  6. C#操作XML方法详解

    using System.Xml; //初始化一个xml实例 XmlDocument xml=new XmlDocument();   //导入指定xml文件 xml.Load(path); xml. ...

  7. 特征点方法 - Harris和SURF的手工实现

    整理去年做的小项目,纪念我的图像处理入门. 因为要在DSP上实现,所以完全手工C代码垒起来的,还要保证和PC端跑的结果一样,觉得可能特殊场景会有用,上传github,没有依赖任何库: 格式注释什么的暂 ...

  8. HTTPS 之共享秘钥 公钥 及 私钥

    HTTPS 之共享秘钥 公钥 及 私钥一 共享秘钥1.1 概念共享秘钥和我们生活中同一把锁的钥匙概念类似,对同一把锁来说,加锁时使用什么钥匙,解锁也必须使用同样的钥匙. 1.2 共享秘钥在HTTP传输 ...

  9. 转:C#判断ContextMenuStrip右键菜单的来源(从哪个控件弹出来的)

    转载自:http://hi.baidu.com/cookiemulan/item/82df8ff867dd53cc531c26c7 有时候,为了提高性能和节约资源,我们会为多个控件,指定同一个右键弹出 ...

  10. CSS, JavaScript 压缩, 美化, 加密, 解密

    CSS, JavaScript 压缩, 美化, 加密, 解密 JS压缩, CSS压缩, javascript compress, js在线压缩,javascript在线压缩,css在线压缩,YUI C ...