topcoder srm 340 div1
problem1 link
$f[i][L][R]$表示计算到第$i$个,最小最大值是$L,R$时的最少个数。
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class ProblemsToSolve { int[] unique(int[] p) {
int n=p.length;
int[] a=new int[n];
for(int i=0;i<n;++i) {
a[i]=p[i];
}
Arrays.sort(a);
int id=0;
for(int i=1;i<n;++i) {
if(a[i]!=a[id]) {
a[++id]=a[i];
}
}
++id;
if(id==n) {
return a;
}
int[] q=new int[id];
for(int i=0;i<id;++i) {
q[i]=a[i];
}
return q;
} int getindex(int[] p,int x) {
for(int i=0;i<p.length;++i) {
if(p[i]==x) {
return i;
}
}
return -1;
} public int minNumber(int[] p,int variety) {
final int n=p.length;
final int[] a=unique(p);
final int m=a.length;
int[][][] f=new int[n][m][m]; for(int i=0;i<n;++i) {
p[i]=getindex(a,p[i]);
} int result=n;
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
for(int k=0;k<m;++k) {
f[i][j][k]=-1;
}
}
}
f[0][p[0]][p[0]]=1;
for(int i=1;i<n;++i) {
for(int j=i-1;j>=i-2&&j>=0;--j) {
for(int x=0;x<m;++x) {
for(int y=x;y<m;++y) {
if(f[j][x][y]==-1) continue; if(p[i]>y) {
if(a[p[i]]-a[x]>=variety) {
result=Math.min(result,f[j][x][y]+1);
continue;
}
}
else if(p[i]<x) {
if(a[y]-a[p[i]]>=variety) {
result=Math.min(result,f[j][x][y]+1);
continue;
}
} final int nx=Math.min(x,p[i]);
final int ny=Math.max(y,p[i]); if(f[i][nx][ny]==-1||f[i][nx][ny]>f[j][x][y]+1) {
f[i][nx][ny]=f[j][x][y]+1;
} }
}
}
}
return result;
}
}
problem2 link
$f[i][j]$表示两个分数分别达到$i,j$时选择的最少课程数,并记录选择的课程是哪些。这样进行bfs即可。
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class CsCourses { String int2string(int x) {
if(x<10) {
return "0"+Integer.toString(x);
}
return Integer.toString(x);
} public int[] getOrder(int[] t, int[] p, int[] e, int skillBound) {
if(skillBound==0) {
return new int[0];
}
final int n=t.length; int[][] f=new int[51][51];
String[][] d=new String[51][];
boolean[][] inq=new boolean[51][51];
for(int i=0;i<51;++i) {
d[i]=new String[51];
for(int j=0;j<51;++j) {
f[i][j]=-1;
inq[i][j]=false;
}
} Queue<Integer> que=new LinkedList<>(); for(int i=0;i<n;++i) {
if(t[i]<=1&&p[i]<=1&&e[i]>=1&&t[i]+p[i]>0&&f[t[i]][p[i]]==-1) {
f[t[i]][p[i]]=1;
d[t[i]][p[i]]=int2string(i);
que.offer(t[i]*100+p[i]);
inq[t[i]][p[i]]=true;
}
} while(!que.isEmpty()) {
final int ii=que.peek()/100;
final int jj=que.peek()%100;
que.poll();
if(ii>=skillBound&&jj>=skillBound) {
continue;
} for(int k=0;k<n;++k) {
if(t[k]<=ii&&p[k]<=jj) continue;
if(t[k]-ii>1) continue;
if(p[k]-jj>1) continue;
if(e[k]<=f[ii][jj]) continue;
final int nii=Math.max(ii,t[k]);
final int njj=Math.max(jj,p[k]); if(f[nii][njj]==-1
||f[nii][njj]>f[ii][jj]+1
||f[nii][njj]==f[ii][jj]+1
&&0<d[nii][njj].compareTo(d[ii][jj]+","+int2string(k))) {
f[nii][njj]=f[ii][jj]+1;
d[nii][njj]=d[ii][jj]+","+int2string(k);
if(!inq[nii][njj]) {
que.offer(nii*100+njj);
inq[nii][njj]=true;
}
} }
}
int num=Integer.MAX_VALUE;
String route="";
for(int i=skillBound;i<51;++i) {
for(int j=skillBound;j<51;++j) {
if(f[i][j]!=-1&&f[i][j]<num||f[i][j]==num&&d[i][j].compareTo(route)<0) {
num=f[i][j];
route=d[i][j];
}
}
}
if(num==Integer.MAX_VALUE) {
return new int[0];
}
String[] path=route.split(",");
int[] result=new int[path.length]; for(int i=0;i<path.length;++i) {
result[i]=Integer.valueOf(path[i]);
}
return result; }
}
problem3 link
判断一个点在多边形的内部还是外部可以用射线法。一条从某一点发出的射线与多边形有奇数个交点则在内部。
初始时认为每个格子有个垂直向上的射线。每次横着走时,下面的所有格子与多边形的交点个数增加了1.
$f[x][y][mask]$表示从$(0,0)$走到$(x,y)$,经过的$'I'$或者$'X'$的状态是$mask$的最短路。
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class VegetableGarden { public int[] getMinDistances(String[] g) {
final int n = g.length;
final int m = g[0].length();
int id = 0;
int badMask=0;
int iNum=0;
List<Integer> list=new ArrayList<>();
for(int i=0;i<n;++i) {
for(int j=0;j<m;++j) {
if(g[i].charAt(j)!='.') {
if(g[i].charAt(j)=='X') {
badMask|=1<<id;
}
else {
++iNum;
}
list.add(i*100+j);
++id;
}
}
}
int[][][] f=new int[n+1][m+1][1<<id];
boolean[][][] inq=new boolean[n+1][m+1][1<<id];
for(int i=0;i<n+1;++i) {
for(int j=0;j<m+1;++j) {
for(int k=0;k<(1<<id);++k) {
f[i][j][k]=-1;
inq[i][j][k]=false;
}
}
}
Queue<Integer> queue=new LinkedList<>();
f[0][0][0]=0;
inq[0][0][0]=true;
queue.offer(0);
final int[] dx={0,1,0,-1};
final int[] dy={1,0,-1,0};
while(!queue.isEmpty()) {
final int mask=queue.peek()/10000;
final int x=queue.peek()%10000/100;
final int y=queue.peek()%100;
queue.poll();
inq[x][y][mask]=false;
for(int d=0;d<4;++d) {
final int xx=x+dx[d];
final int yy=y+dy[d];
if(xx<0||yy<0||xx>=n+1||yy>=m+1) continue;
int nMask=mask;
if(d==0||d==2) {
final int column=d==0?y:y-1; for(int k=0;k<list.size();++k) {
final int nx=list.get(k)/100;
final int ny=list.get(k)%100;
if(ny==column&&nx>=x) {
nMask^=1<<k;
}
}
} if(f[xx][yy][nMask]==-1||f[xx][yy][nMask]>f[x][y][mask]+1) {
f[xx][yy][nMask]=f[x][y][mask]+1;
if(!inq[xx][yy][nMask]) {
inq[xx][yy][nMask]=true;
queue.offer(nMask*10000+xx*100+yy);
}
} }
}
int[] result=new int[iNum];
for(int i=0;i<(1<<id);++i) {
if((i&badMask)!=0) continue;
if(f[0][0][i]==-1) continue;
int c=0;
int k=i;
while(k!=0) {
c+=k&1;
k>>=1;
}
if(c==0) {
continue;
}
if(result[c-1]==0||result[c-1]>f[0][0][i]) {
result[c-1]=f[0][0][i];
}
}
return result;
}
}
topcoder srm 340 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)其 ...
随机推荐
- 使用mysqlbinlog从二进制日志文件中查询mysql执行过的sql语句 (原)
前提MySQL开启了binlog日志操作1. 查看MySQL是否开启binlog(进mysql操作) mysql> show variables like 'log_bin%'; 2 ...
- JavaScript-模拟收银台小程序
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- HTML5特效收录-不定时更新
在工作中,我们可能会用到各种交互效果.而这些效果在平常翻看文章的时候碰到很多,但是一时半会又想不起来在哪,所以养成知识整理的习惯是很有必要的.希望能给大大家启发,并且学习. HTML5 Canvas粒 ...
- Unity shader学习之轮廓效果
将物体描一层边可以使游戏看起来具有卡通风格,一种简单的实现方法如下: 将物体渲染2次,即使用2个通道. 第一个通道将顶点沿法线(或中心点到顶点的方向)做一个偏移,即将模型扩大一点,并将颜色渲染成轮廓的 ...
- java中的锁之AbstractQueuedSynchronizer源码分析(二)
一.成员变量. 1.目录. 2.state.该变量标记为volatile,说明该变量是对所有线程可见的.作用在于每个线程改变该值,都会马上让其他线程可见,在CAS(可见锁概念与锁优化)的时候是必不可少 ...
- 使用.NET向webService传double、int、DateTime 服务器得到的数据时null的问题(转http://blog.csdn.net/slimboy123/article/details/4366701)
用C#.NET调用Java开发的WebService时,先在客户端封装的带有int属性的对象,当将该对象传到服务器端时,服务器端可以得到string类型的属性值,却不能得到int类型.double和D ...
- cocos 搭建安卓环境
http://blog.csdn.net/yiye3376/article/details/42219889
- Python学习记录之(五)-----类进阶篇
静态方法 类方法 属性方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调 ...
- django之auth认证系统
Django自带的用户认证 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这还真是个麻烦的事情呢. Djang ...
- 在Hue中提交oozie定时任务
可以参见下面这篇博文: 通过hue提交oozie定时任务