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的更多相关文章

  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. C语言记录汇总

    uint32_t     转载自:http://blog.sina.com.cn/s/blog_6aea878e0100tl0f.html体会1>. 在写程序时注意"无符号类型&quo ...

  2. C++二进制字符串转Base64字符串 Base64字符串转二进制字符串

    封装成类的 . base64格式的字符串,只包含大小写字母.零到九,以及 + / //___base_64.h /*base_64.h文件*/ #ifndef BASE_64_H #define BA ...

  3. MyBatis基础入门《十九》动态SQL(set,trim)

    MyBatis基础入门<十九>动态SQL(set,trim) 描述: 1. 问题 : 更新用户表数据时,若某个参数为null时,会导致更新错误 2. 分析: 正确结果: 若某个参数为nul ...

  4. CSS3 transition-timing-function 深入理解和技巧

    基础 语法: transition-timing-function : ease | linear | ease-in | ease-out | ease-in-out | cubic-bezier( ...

  5. Unity shader学习之Alpha Test的阴影

    Alpha Test的阴影, shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClip ...

  6. python多线程,多进程编程。

    进程,是目前计算机中为应用程序分配资源的最小单位: 线程,是目前计算机中运行应用程序的最小单位: 在实际系统中,其实进程都是被分为线程来实现的,所以参与时间片轮转的是线程: 但是管理应用程序的资源的单 ...

  7. STL之List容器

    1.List容器 1) list是一个双向链表容器,可高效地进行插入删除元素. 2)list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符.It++(ok) it+5(err) 3)头 ...

  8. python2.7之乱码问题

    python 3之后当然不存在乱码问题了.python 2的乱码问题有时就有点头疼了.(代码均为在windows下测试) 示例:保存为test1.py 报错信息如下: 解决办法: 我将代码保存为tes ...

  9. RabbitMQ生产者消费者

    package com.ra.car.rabbitMQ; import java.io.IOException; import java.util.HashMap; import java.util. ...

  10. 关于在搜索栏的一些小bug

    问题:我们在使用input标签和button按钮写搜索框的时候,书写在两行的时候会有缝隙,其次,input标签如果用大的div括起来,里面依然会显示边框. 解决方法:1.关于input标签,我们将属性 ...