topcoder srm 475 div1
problem1 link
暴力枚举$r$只兔子的初始位置,然后模拟即可。
problem2 link
假设刚生下来的兔子是1岁,那么能够生小兔子的兔子的年龄是至少3岁。
那么所有的兔子按照年龄可以分为1岁,2岁,大于等于3岁三种情况。不妨令个数分别为$a_{1},a_{2},a_{3}$
在每年生完兔子后,假如是四月,这时候1岁的兔子和大于等于3岁的兔子的数量是一样的($a_{1}=a_{3}$)。那么在11月的时候,如果要去掉一半的兔子,那么一定是大于等于三岁的所有兔子和2岁兔子的一半。$a_{3}=0,a_{2}=\frac{a_{2}}{2}$ or $a_{2}=\frac{a_{2}+1}{2}$
现在的问题是要确定现在2岁的兔子的个数是奇数还是偶数。不妨令三种兔子的奇偶数分别是$x_{1},x_{2},x_{3}$
假设$x_{2}=t*2^{51}+r$,$0 \leq r < 2^{51}$
那么只需要用$r$的奇偶性来代表$x_{2}$的奇偶性即可,即便有除以2,以及加1再除以2的操作。因为$t*2^{51}$除以若干次2后(小于等于50次)仍然是偶数。
problem3 link
假设有$n$只兔子
首先计算出每个兔子得分的最大值最小值。minPoints,maxPoints
设选出的selected只兔子的最后一只的编号为$x$, 假设它此时的得分 maxPoints[x]
另外假设其他选择的兔子都是它们的最高得分,而未选兔子都是它们的最低得分
令$f[i][j][k]$表示在前$i$只兔子中,有$j$只的排名高于$x$且在这$j$只中选出了$k$只的情况有多少种。那此次的答案为$Answer_{x}=\sum_{i= selected}^{qualified}f[n][i][selected]$
这里需要考虑的是,会不会出现这样的情况导致少计算了方案数:由于$x$固定得了maxPoints[x]分,而如果它的得分少于maxPoints[x]时,可能会出现某个兔子$t$的排名在$x$之前。(比如$minPoints[x]<maxPoints[t]<maxPoints[x]$)
其实这种情况不会漏算,因为当枚举$t$作为最后选出兔子的最后一只时,会算上这种情况。
因此,只需要考虑选择的兔子都是它们的最高得分,而未选兔子都是它们的最低得分即可。
code for problem1
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class RabbitStepping { int result = 0;
String field = null;
int[] q = null;
int[] pre = null; public double getExpected(String field, int r) {
this.field = field;
q = new int[field.length()];
pre = new int[field.length()];
dfs(0, 0, r, new int[field.length()]);
long p = 1;
for (int i = 1; i <= r; ++ i) {
p = p * (field.length() + 1 - i) / i;
}
return 1.0 * result / p;
}
void dfs(int dep, int start, int tot, int[] p) {
if (dep == tot) {
cal(p);
return;
}
if (start == p.length) {
return;
}
if (tot - dep > p.length - start) {
return;
}
for (int i = start; i < p.length; ++ i) {
p[i] = 1;
dfs(dep + 1, i + 1, tot, p);
p[i] = 0;
}
} void move(int from, int to) {
q[to] += 1;
q[from] -= 1;
pre[to] = from;
} void cal(int[] p) {
for (int i = 0; i < p.length; ++ i) {
q[i] = p[i];
}
int size = q.length;
Arrays.fill(pre, -1);
int[] pre1 = new int[p.length];
int[] q1 = new int[p.length];
while (size > 2) {
for (int i = 0; i < size; ++ i) {
pre1[i] = pre[i];
q1[i] = q[i];
}
for (int i = 0; i < size; ++ i) {
if (q1[i] == 0) {
continue;
}
if (i == 0) {
move(0, 1);
}
else if (i == size - 1 || i == size - 2) {
move(i, i - 1);
}
else if (field.charAt(i) == 'W'){
move(i, i - 1);
}
else if (field.charAt(i) == 'B') {
move(i, i + 1);
}
else {
if (size == p.length) {
move(i, i - 1);
}
else {
move(i, pre1[i]);
}
}
}
for (int i = 0; i < size; ++ i) {
if (q[i] >= 2) {
q[i] = 0;
pre[i] = 0;
}
}
size -= 1;
}
for (int i = 0; i < size; ++ i) {
result += q[i];
}
}
}
code for problem2
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class RabbitIncreasing { final static int mod = 1000000009;
final static long MOD = 1l << 51;
final static int rev2 = Pow(2, mod - 2, mod); public int getNumber(int[] leaving, int k) {
int a3 = 0, a2 = 0, a1 = 1;
long x3 = 0, x2 = 0, x1 = 1;
if (leaving[0] == 1) {
return 0;
}
int t = 0;
for (int i = 2; i <= k; ++ i) {
a3 = (a3 + a2) % mod;
a2 = a1;
a1 = a3;
x3 = (x3 + x2) % MOD;
x2 = x1;
x1 = x3;
if (t < leaving.length && leaving[t] == i) {
x3 = 0;
a3 = 0;
if ((x2 & 1) == 1) {
x2 -= 1;
a2 = (a2 + mod - 1) % mod;
}
x2 >>= 1;
a2 = (int)((long)a2 * rev2 % mod);
t += 1;
}
}
return ((a3 + a2) % mod + a1) % mod; } static int Pow(int a, int b, int mod) {
int result = 1;
a %= mod;
while (b != 0) {
if ((b & 1) == 1) {
result = (int)((long)result * a % mod);
}
a = (int)((long)a * a % mod);
b >>= 1;
}
return result;
} }
code for problem3
import java.util.*;
import java.math.*;
import static java.lang.Math.*; public class RabbitProgramming { int[] minPoints = null;
int[] maxPoints = null;
long[][][] f = null;
int n;
int qualified;
int selected; public long getTeams(int[] points, String[] standings, int qualified, int selected) {
this.n = standings.length;
this.qualified = qualified;
this.selected = selected;
minPoints = new int[n];
maxPoints = new int[n];
for (int i = 0; i < points.length; ++ i) {
for (int j = 0; j < n; ++ j) {
if (standings[j].charAt(i) == 'N') {
continue;
}
if (points[i] > 0) {
minPoints[j] += points[i];
maxPoints[j] += points[i];
}
else {
maxPoints[j] += -points[i];
}
}
}
f = new long[n][qualified + 1][selected + 1];
long result = 0;
for (int x = 0; x < n; ++ x) {
cal(x);
for (int i = selected; i <= qualified; ++ i) {
result += f[n - 1][i][selected];
}
}
return result;
}
void cal(int x) {
for (int i = 0; i < n; ++ i) {
for (int j = 0; j <= qualified; ++ j) {
Arrays.fill(f[i][j], 0);
}
}
if (x == 0) {
f[0][1][1] = 1;
}
else {
if (minPoints[0] < maxPoints[x]) {
f[0][0][0] = 1;
}
else {
f[0][1][0] = 1;
}
if (maxPoints[0] >= maxPoints[x]) {
f[0][1][1] = 1;
}
}
for (int i = 1; i < n; ++ i) {
for (int j = 0; j <= qualified; ++ j) {
for (int k = 0; k <= selected; ++ k) {
final long val = f[i - 1][j][k];
if(val == 0) {
continue;
}
if (i == x) {
if (j < qualified && k < selected) {
f[i][j + 1][k + 1] += val;
}
continue;
}
if (i < x && minPoints[i] < maxPoints[x]
|| i > x && minPoints[i] <= maxPoints[x]) {
f[i][j][k] += val;
}
else if(j < qualified) {
f[i][j + 1][k] += val;
}
if ((i < x && maxPoints[i] >= maxPoints[x]
|| i > x && maxPoints[i] > maxPoints[x])
&& j < qualified && k <selected) {
f[i][j + 1][k + 1] += val;
}
}
}
}
}
}
topcoder srm 475 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 607 div1题解
好久没来写了,继续继续... Easy(250pts): //前方请注意,样例中带有zyz,高能预警... 题目大意:给你一个字符串,中间有一些是未知字符,请你求出这个字符串的回文子串个数的期望值.数 ...
- 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 ...
随机推荐
- php 提取多维数组指定列
前言:有时候在开发中会遇到这样的问题,我们需要把有规律的多维数组按照纵向(列)取出,有下面的方法可用: 我们将拿下面的数组来处理: 1 $arr = array( 2 '0' => array( ...
- 记在Archlinux中安装python的pymssql模块过程中遇到的问题
为什么要安装这个模块?因为要连接SQLServer数据库. 看到可以使用pyodbc这个模块进行连接,但对odbc不熟悉,所以选用了看起来更简单的 pymssql. 直接执行: pip install ...
- tcl脚本
tcl,全名tool command language,是一种通用的工具语言. 1)每个命令之间,通过换行符或者分号隔开: 2)tcl的每个命令包含一个或者多个单词,默认第一个单词表示命令,第二个单词 ...
- 《大话设计模式》c++实现 原型模式
意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 主要解决:在运行期建立和删除原型. 何时使用: 1.当一个系统应该独立于它的产品创建,构成和表示时. 2.当要实例化的类是在运行 ...
- linux 下nginx
所有的配置文件都在/etc/nginx (ect/nginx/nginx.conf) 下,并且每个虚拟主机已经安排在 了/etc/nginx/sites-avail ...
- ASP.NET JSON(转http://www.360doc.com/content/14/0615/21/18155648_386887590.shtml)
概念介绍还是先简单说说Json的一些例子吧.注意,以下概念是我自己定义的,可以参考.net里面的TYPE的模型设计如果有争议,欢迎提出来探讨!1.最简单:{"total":0} t ...
- keras tensorboard的使用
http://blog.csdn.net/xiaojiajia007/article/details/72865764 https://stackoverflow.com/questions/4211 ...
- MongoDB-Java的两个基本操作Upsert和insertMany
此文只是为了记录几个基本操作,首先Upsert,有多种方法可以进行,但是都需要指定UpdateOptions.upsert(true),其中最简单的办法如下(eqq是一个用来filter的BSON,具 ...
- 关于js闭包之小问题大错误
闭包是 JavaScript 开发的一个关键方面:匿名函数可以访问父级作用域的变量. 如果闭包的作用域中保存着一个 HTML 元素,则该元素无法被销毁.(下面代码来自高程) 刚看到一个关于闭包自己没注 ...
- POJ 1789 Truck History (Kruskal 最小生成树)
题目链接:http://poj.org/problem?id=1789 Advanced Cargo Movement, Ltd. uses trucks of different types. So ...