topcoder srm 440 div1
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的更多相关文章
- Topcoder SRM 643 Div1 250<peter_pan>
Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...
- Topcoder Srm 726 Div1 Hard
Topcoder Srm 726 Div1 Hard 解题思路: 问题可以看做一个二分图,左边一个点向右边一段区间连边,匹配了左边一个点就能获得对应的权值,最大化所得到的权值的和. 然后可以证明一个结 ...
- topcoder srm 714 div1
problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...
- topcoder srm 738 div1 FindThePerfectTriangle(枚举)
Problem Statement You are given the ints perimeter and area. Your task is to find a triangle wi ...
- Topcoder SRM 602 div1题解
打卡- Easy(250pts): 题目大意:rating2200及以上和2200以下的颜色是不一样的(我就是属于那个颜色比较菜的),有个人初始rating为X,然后每一场比赛他的rating如果增加 ...
- Topcoder SRM 627 div1 HappyLettersDiv1 : 字符串
Problem Statement The Happy Letter game is played as follows: At the beginning, several players ...
- Topcoder SRM 584 DIV1 600
思路太繁琐了 ,实在不想解释了 代码: #include<iostream> #include<cstdio> #include<string> #include& ...
- TopCoder SRM 605 DIV1
604的题解还没有写出来呢.先上605的. 代码去practice房间找. 说思路. A: 贪心,对于每个类型的正值求和,如果没有正值就取最大值,按着求出的值排序,枚举选多少个类型. B: 很明显是d ...
- 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)其 ...
随机推荐
- webpack使用六
插件(Plugins) 插件(Plugins)是用来拓展Webpack功能的,它们会在整个构建过程中生效,执行相关的任务. Loaders和Plugins常常被弄混,但是他们其实是完全不同的东西,可以 ...
- webpack的使用二
1.安装 Webpack可以使用npm安装,新建一个空的练习文件夹(此处命名为webpack sample project),在终端中转到该文件夹后执行下述指令就可以完成安装 //全局安装 npm i ...
- C\C++程序结束另外的进程
WinExec("taskkill /f /im center_flextrbo.exe",SW_HIDE);
- Install the mongdb
#!/bin/bash#Function: Install the mongdb#Author: WangDonghui#Date: 20180124 #Installing mongdbecho & ...
- 集体干死java 在启动.sh
#!/bin/bash#reboot .jar#author wangdonghuipid=`ps -ef |grep java |awk '{print $2}'`echo $pidecho'--- ...
- jQuery-图片轮播-随意切换图片
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Ajax技术之XMLHttpRequest(二)【XMLHttpRequest常用方法和属性】
一.XMLHttpRequest中常用的方法: (1)open()方法:用于设置进行异步请求目标的URL.请求方法以及其他参数信息. 函数原型:open("method",&quo ...
- kali linux 基本命令(第一批)
pwd , rm ,locate ,cat ,head , clear ,ls ,cd ,mkdir ,touch ,ec ...
- django admin 处理文本换行空格
使用 linebreaks filter <p>{{ blogpassage.content|linebreaksbr }}<p>
- 记一次CentOS5.7更新glibc导致libc.so.6失效,系统无法启动
以下是错误示范,错误过程还原,请勿模仿!!! wkhtmltopdf 启动,提示/lib64/libc.so.6版本过低 $ ./wkhtmltopdf http:www.baidu.com 1. ...