problem1 link

两个数字后面都有阶乘符号,可以抵消。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class ExtraordinarilyLarge {public String compare(String x, String y) {boolean both=false;while(x.endsWith("!")&&y.endsWith("!")) {x=x.substring(0,x.length()-1);y=y.substring(0,y.length()-1);both=true;}boolean bswap=false;if(x.endsWith("!")) {String t=new String(x);x=y;y=t;bswap=true;}long xx=Long.valueOf(x);if(xx==0&&both) {xx=1;}long yy=1;if(y.endsWith("!")) {int id=y.indexOf("!");yy=Long.valueOf(y.substring(0,id));final int num=y.length()-id;for(int i=0;i<num&&yy<=xx;++i) {yy=cal(yy,xx);}}else {yy=Long.valueOf(y);if(yy==0&&both) {yy=1;}}if(xx<yy) {if(bswap) {return "x>y";}return "x<y";}else if(xx==yy) {return "x=y";}else {if(bswap) {return "x<y";}return "x>y";}}long cal(long x,long y) {if(x==0) {return 1;}long result=1;for(int i=2;i<=x;++i) {if(result<=y/i) {result=result*i;}else {return y+1;}}return result;}
}

problem2 link

在一个有向无环图上进行dp即可。

import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class ContestSchedule {public double expectedWinnings(String[] contests) {final int n=contests.length;int[][] p=new int[n][3];for(int i=0;i<n;++i) {String[] t=contests[i].split("\\W+");assert t.length==3;for(int j=0;j<3;++j) {p[i][j]=Integer.valueOf(t[j]);}}boolean[][] g=new boolean[n][n];for(int i=0;i<n;++i) {for(int j=0;j<n;++j) {if(i==j) {g[i][j]=false;continue;}if(p[i][1]<=p[j][0]) {g[i][j]=true;}else {g[i][j]=false;}}}Queue<Integer> queue=new LinkedList<>();double[] f=new double[n];boolean[] inq=new boolean[n];for(int i=0;i<n;++i) {inq[i]=true;f[i]=p[i][2]/100.0;queue.offer(i);}while(!queue.isEmpty()) {final int u=queue.poll();inq[u]=false;for(int i=0;i<n;++i) {if(g[u][i]) {final double c=p[i][2]/100.0;if(f[u]+c>f[i]) {f[i]=f[u]+c;if(!inq[i]) {inq[i]=true;queue.offer(i);}}}}}double result=0;for(int i=0;i<n;++i) {result=Math.max(result,f[i]);}return result;}
}

problem3 link

$n,m$中小的那个必定小于9.这样一行一行进行dp即可。

import com.sun.org.apache.xpath.internal.operations.Bool;import java.util.*;
import java.math.*;
import static java.lang.Math.*;public class SeatingPlan {public String expectedTrial(int m, int n, int k) {if(n<m) {int x=m;m=n;n=x;}long[][][] f=new long[n+1][1<<m][k+1];int[] num=new int[1<<m];num[0]=0;for(int i=1;i<(1<<m);++i) {num[i]=num[i>>1]+(i&1);}List<List> g=new ArrayList<>();for(int i=0;i<(1<<m);++i) {List<Integer> list=new ArrayList<>();if(((i>>1)&i)!=0) {g.add(list);continue;}for(int j=0;j<(1<<m);++j) {if((i&j)==0&&((j>>1)&j)==0) {list.add(j);}}g.add(list);}f[0][0][0]=1;for(int i=1;i<=n;++i) {for(int j=0;j<(1<<m);++j) {for(int t=0;t<=k;++t) {if(0==f[i-1][j][t]) {continue;}List list=g.get(j);for(int p=0;p<list.size();++p) {int s=(int)list.get(p);if(t+num[s]>k) {continue;}f[i][s][t+num[s]]+=f[i-1][j][t];}}}}long result=0;for(int i=0;i<(1<<m);++i) {result+=f[n][i][k];}if(result==0) {return "Impossible!";}BigInteger sum=BigInteger.ONE;for(int i=1;i<=k;++i) {sum=sum.multiply(int2biginteger(n*m-i+1)).divide(int2biginteger(i));}long s=Long.valueOf(sum.toString());long p=gcd(result,s);result/=p;s/=p;return Long.toString(s)+"/"+Long.toString(result);}static long gcd(long x,long y) {return y==0?x:gcd(y,x%y);}static BigInteger int2biginteger(int x) {return new BigInteger(Integer.toString(x));}
}

  

转载于:https://www.cnblogs.com/jianglangcaijin/p/7471330.html

topcoder srm 320 div1相关推荐

  1. topcoder srm 714 div1

    problem1 link 倒着想.每次添加一个右括号再添加一个左括号,直到还原.那么每次的右括号的选择范围为当前左括号后面的右括号减去后面已经使用的右括号. problem2 link 令$h(x) ...

  2. topcoder srm 691 div1 -3

    1.给定一个$n$个顶点$n$个边的图,边是$(i,a_{i})$,顶点编号$[0,n-1]$.增加一个顶点$n$,现在选出一个顶点集$M$,对于任意的在$M$中 的顶点$x$,去掉边$(x,a_{x ...

  3. topcoder srm 706 div1

    1.给定一个迷宫,点号表示不可行,井号表示可行.现在可以改变其中的一些井号的位置.问最少改变多少个井号可以使得从左上角到右下角存在路径. 思路:设高为$n$,宽为$m$,若井号的个数$S$小于$n+m ...

  4. topcoder srm 694 div1 -3

    1.给出$n$个数字,将其分成三个非空的组,每组的权值为该组所有数字的抑或.选择一种分法使得三组的权值和最大? 思路:记录前两组的权值且三组有没有数字时第三组的值.(当前两组的值知道时第三组的权值是确 ...

  5. topcoder srm 330 div1

    problem1 link 直接模拟. import java.util.*; import java.math.*; import static java.lang.Math.*;public cl ...

  6. topcoder srm 360 div1

    problem1 link (1)$n \neq m$时,假设$n<m$,那么同一行中的$m$个数字必定都相等. (2)$n=m$时,要满足任意的$i_{1},i_{2},j_{1},j_{2} ...

  7. topcoder srm 635 div1

    problem1 link 首先枚举长度$L$.然后计算每一段长度$L$的差值最大公约数,然后差值除以最大公约数的结果可以作为当前段的关键字.然后不同段就可以比较他们的关键字,一样就是可以转化的. p ...

  8. topcoder srm 495 div1

    problem1 link 从前向后确定一下,然后再从后向前确定一下.一样的话就是可以确定的. problem2 link 首先将强连通分量缩点.理论上来说,只需要遍历所有入度为0的联通块中的一个即可 ...

  9. topcoder srm 325 div1

    problem1 link $g[i]$表示解决前$i$个的代价,那么$g[i]$是所有$g[j]+cost(j+1,i)$的最小值. import java.util.*; import java. ...

最新文章

  1. Asp.net基础概念之 HttpModule
  2. python遍历字典的四种方法
  3. linux怎么锁定test用户,用户被锁定不影响JOB的运行
  4. python爬取新闻发送微信_如何利用 Python 爬虫实现给微信群发新闻早报?(详细)...
  5. HDU1061 Rightmost Digit【快速模幂】
  6. 卷积神经网络问题总结
  7. C# 处理XML的基本操作
  8. java 1.6 jre 下载_jre1.6下载-Java环境 官方版 - 安下载
  9. 怎样规划你毕业以后的人生
  10. BMFont把美术图片(汉字,数字,字母)字生成艺术字体fnt格式
  11. 信号完整性仿真设计——PCB工程师必修课
  12. oracle 恢复dmp数据,Oracle数据库使用DMP文件恢复数据
  13. 基于asp.net344运输公司车辆调度管理系统
  14. 原创:商务通弹窗最新破解方法
  15. AsyncTask——AsyncTask串行and并行
  16. linux开启514端口,查看linux服务器所开放的端口
  17. 读书笔记16 《傅雷家书》 傅雷傅敏
  18. 文件加密解密大师 v1.64 绿色
  19. js 判断是什么类型浏览器
  20. 5种css隐藏元素的方法_在CSS中隐藏元素的10种方法

热门文章

  1. VTK:Utilities之OffScreenRendering
  2. VTK:简单操作之ProjectPointPlane
  3. VTK:PolyData之PointNormals
  4. VTK:Parallel之ExodusIIWriter
  5. VTK:图片之InteractWithImage
  6. Qt Creator设置Nimble
  7. C++const的作用与使用
  8. 经典C语言程序100例之五一
  9. python关键字列表的表达式,python 列表推导和生成器表达式的使用
  10. java大整数的加减乘除_关于大整数的加减乘除求余运算 java