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)其 ...
随机推荐
- Boot-col-sm布局
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Javascript-for循环案例-打印1-100之间所有的数字
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- install apache-activemq
进入bin/linux-x86-64下 cd apache-activemq-5.14.1/bin/linux-x86-64/ 启动 ./activemq start 五.启动成功后,访问 activ ...
- eclipse设置字体_字符编码_快捷键
eclipse设置字体.字符编码.快捷键 1.设置字体: preferences->general->appearnce->colors and fonts-->basic-- ...
- 数据分析之Numpy库入门
1.列表与数组 在python的基础语言部分,我们并没有介绍数组类型,但是像C.Java等语言都是有数组类型的,那python中的列表和数组有何区别呢? 一维数据:都表示一组数据的有序结构 区别: 列 ...
- Keras 如何利用训练好的神经网络进行预测
分成两种情况,一种是公开的训练好的模型,下载后可以使用的,一类是自己训练的模型,需要保存下来,以备今后使用. 如果是第一种情况,则参考 http://keras-cn.readthedocs.i ...
- ASP.NET界面重定向传值
这么说吧,当程序启动时,ASP.NET会自动创建一些经常使用的类的实例,而这些实例就是ASP.NET的内置对象,常用的实例对象有:Response(来自HttpResponse类).Request(来 ...
- bash shell 编程练习
原始文件: find /etc -name passwd 2>&1 | tee ee.log 1. cat -n 把 e.log 的文档内容加上行号后输入 e2.log 这个文档里: x ...
- python小练习:读入一个考试得分,判断这个分数是哪个等级,并输出,考虑异常场景
读入一个考试得分,判断这个分数是哪个等级,并输出. 等级:>=90 优 ,>=80且小于90 良,>=70 且小于80,中,>=60且<70及格 <60 不及格 ...
- 第三方统计分析埋点工具对比,神策、Ptmind、GrowingIO、国双,还有谷歌分析,谁更好?
第三方统计分析埋点工具对比,神策.Ptmind.GrowingIO.国双,还有谷歌分析,谁更好?https://www.colabug.com/2985393.html GA.Mixpanel 和神策 ...