上一页 1 ··· 53 54 55 56 57 58 59 60 61 ··· 85 下一页
  2011年12月14日
摘要: SGU_104 我们可以用f[i][j]、p[i][j]分别表示第i行扫描第j个瓶子时的最大值以及取得这个最大值时第i行的花放到了哪个瓶子中。#include<stdio.h>#include<string.h>#define MAXD 110#define INF 0x3fffffffint F, V, f[MAXD][MAXD], v[MAXD][MAXD], p[MAXD][MAXD];void printpath(int i, int j){ if(i != 1) { printpath(i - 1, p[i][j] - 1); printf("... 阅读全文
posted @ 2011-12-14 12:22 Staginner 阅读(324) 评论(0) 推荐(0) 编辑
摘要: UVA_11176 这个题目一开始打算去求一共有i个W时连续的W不超过j个的情况总数,但后来发现复杂度n^3一直降不下来,后来看了UVA论坛上的提示,终于写出了n^2的算法。 我们设f[i][j]表示到第i场比赛时连续的W不超过j场的概率,那么最后我们只要用j乘以对应的f[N][j]-f[N][j-1]之后求和即可。 接下来我们考虑状态如何转移,对于i=1,显然f[1][0]=1-P,f[1][i]=1(i>=1),而对于任意一个i>1来讲,实际上第i场比赛要么是W,要么是L,如果不影响连续W的场数的话f[i][j]=f[i-1][j],因为这场是W或者L无所谓。那么什么情况下会影 阅读全文
posted @ 2011-12-14 09:44 Staginner 阅读(611) 评论(0) 推荐(0) 编辑
  2011年12月13日
摘要: UVA_10900 这个题目从一开始思路上就有问题,后来结合别人的解题报告来看,终于明白是怎么回事了,而且也突然发现,貌似我适合冒险但不适合赌博…… 我们不妨设a[i]表示正确做完第i道题的收益的期望,显然我们最后要求的就是a[0]咯,但这个先放一放,我们先讨论一下在做第i+1个题目前我们是选择答题呢还是选择放弃呢。 首先,我们可以直观的想到,如果做完i题就退出的话,就可以得到2^i这么多钱。不妨假设答对第i+1个题的概率为p,那么我们自然会想到用p乘以“某个值”表示答题所获得的收益的期望,如果p乘以这个值大于2^i的话,我们肯定会选择答题咯,因为若是这样答题的话收益的期望是大于不答题的。那. 阅读全文
posted @ 2011-12-13 18:59 Staginner 阅读(1568) 评论(8) 推荐(0) 编辑
摘要: UVA_557 这个题目再一次让我体会了一下数学的简洁美…… 首先来说,我们直接计算所求概率是比较困难的,因为我们要考虑硬币抛到谁那之后就不再抛了,但是如果我们反过来去求不符合要求的概率是比较简便的,因为必然硬币直到最后时刻都会一直在抛,那么对于任意一种最终的不符合要求的情况,都是等可能事件。 那么我们只要把所有不符合要求的情况种数找到,再乘以每种情况的概率2^(2-n)即可。不符合要求的情况的种数用组合数也比较容易算出来,是C((n-2)/2,n-2),即在前n-2个位置随意取(n-2)/2个位置放上汉堡。 根据上面的分析我们会发现f(n)=2^(2-n)*C((n-2)/2,n-2... 阅读全文
posted @ 2011-12-13 15:14 Staginner 阅读(700) 评论(4) 推荐(0) 编辑
摘要: UVA_11181 设事件B为一共有r个人买了东西,设事件Ai为第i个人买了东西。 那么这个题目实际上就是求P(Ai|B),而P(Ai|B)=P(AiB)/P(B),其中P(AiB)表示事件Ai与事件B同时发生的概率,同时总状态并不多,因此我们可以枚举买东西的状态预处理出P(AiB)和P(B),再代入计算即可。#include<stdio.h>#include<string.h>#define MAXD 25int N, R;double ap[MAXD], p[MAXD];void solve(){ int i, j, k; double ans, rp = 0; f 阅读全文
posted @ 2011-12-13 14:06 Staginner 阅读(808) 评论(0) 推荐(0) 编辑
摘要: UVA_10169 这个题目明显可以预处理出结果然后再随用随查。计算的公式并不难推导,在计算0的个数的时候采用一个X=10^(log10(X))这样的转化,这样便只需计算出-log10(X)的整数部分即可。 此外,需要注意的是涉及整数乘法的地方一定要避免溢出,如果中间结果会超过int的范围可以在计算之前根据需要强制转型成double或者long long。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 1000010double f[MAXD];int d[MAXD];void 阅读全文
posted @ 2011-12-13 12:31 Staginner 阅读(341) 评论(0) 推荐(0) 编辑
摘要: UVA_10277 如果设m为红袜子的数量,n为袜子总数,那么可以得到方程m^2-m-p/q*n*(n-1)=0,这时我们发现m和n应是一一对应的关系,因此我们可以通过枚举n来求得m,求的过程中判断m和n是否都为整数即可。 有了这个思路之后,如果直接解方程的话m是有误差的,因此我们可以考虑二分m,注意到函数在m>1/2的部分是单调的,于是我们预判一下是否存在m=0的情况,当然也就是p=0的情况,显然这时n最小为2,同时也可以顺便知道如果p=q那么n最小也为2。 剩下的工作就是枚举n然后把1作为m的下限二分m即可。#include<stdio.h>#include<str 阅读全文
posted @ 2011-12-13 11:14 Staginner 阅读(405) 评论(0) 推荐(0) 编辑
摘要: UVA_542 递推计算一下概率即可。#include<stdio.h>#include<string.h>#define MAXD 20int d[10];double g[MAXD][MAXD], f[10][MAXD];char name[MAXD][15];void solve(){ int i, j, k; for(i = 0; i < 16; i ++) scanf("%s", name[i]); for(i = 0; i < 16; i ++) for(j = 0; j < 16; j ++) scanf(" 阅读全文
posted @ 2011-12-13 10:09 Staginner 阅读(331) 评论(0) 推荐(0) 编辑
摘要: UVA_10759 我们不妨把N个色子看成是依次投掷的,这样最多才6^N个状态,用long long是可以表示的,而我们又比较容易用DP求出不大于X的状态总数,这样计算完之后再约分一下即可。#include<stdio.h>#include<string.h>int N, X;long long int f[30][160];long long int gcd(long long int x, long long int y){ return y == 0 ? x : gcd(y, x % y);}void solve(){ int i, j, k, p; long l 阅读全文
posted @ 2011-12-13 09:00 Staginner 阅读(410) 评论(0) 推荐(0) 编辑
  2011年12月12日
摘要: UVA_10491 公式还是比较容易推的。#include<stdio.h>#include<string.h>double COWS, CARS, SHOW;int main(){ while(scanf("%lf%lf%lf", &COWS, &CARS, &SHOW) == 3) printf("%.5lf\n", (COWS * CARS + CARS * (CARS - 1)) / (CARS + COWS) / (CARS + COWS - SHOW - 1)); return 0;} 阅读全文
posted @ 2011-12-12 23:41 Staginner 阅读(222) 评论(0) 推荐(0) 编辑
上一页 1 ··· 53 54 55 56 57 58 59 60 61 ··· 85 下一页