寒假训练3解题报告 CodeForces #148
CodeForces 148B
一道简单模拟,判断龙能够抓到公主几次,如果公主和龙同时到达公主的城堡,不算龙抓住她,因为路程除以速度可能会产生浮点数,所以这里考虑一下精度问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <algorithm>
using namespace std;
#define eps 1e-19 int ok(int x)
{
if(abs(x)<=eps) return ;
else return x>?:-;
} int main()
{
// freopen("a.in" , "r", stdin);
double vp , vd , t , f , c;
while(~scanf("%lf%lf%lf%lf%lf", &vp , &vd , &t , &f , &c))
{
if(ok(vp-vd) >= ){
puts("");
continue;
}
double del = t*vp;
double cur = del;
int ans = ;
double t1 , t2;//t1princess从dragon在cave时到达目的地要的时间,t2表示dragon从cave追上princess要的时间
t1 = (c-cur)/vp , t2 = (del)/(vd-vp);
while(ok(t1-t2) > ){
cur += t2*vp;
cur = cur+(cur/vd+f)*vp;
del = cur;
t1 = (c-cur)/vp , t2 = (del)/(vd-vp);
ans++;
}
printf("%d\n" , ans);
}
return ;
}
CodeForces 148C
得到a个数,这些数都比先前的数大但不能比前面所有数的和大,得到b个数这些数都比前面的所有数大
这道题自己写的有点坑,太长了,但其实没那么麻烦
那个Wow成立,说明当前数大于前面所有数的和,我们为了使数尽可能小,所以总是将Wow成立的数放前面,Oh成立的数方面,最后多余的数都和前一个数一样即可
当 a+b+1 = n b=0,a>0时是不成立的,因为第二个数开始就必须比前一个数大,那么第二个数比前面的大,也就是大于前面的总和,必然得到的是Wow,与b=0矛盾
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int num[]; int main()
{
// freopen("a.in" , "r", stdin);
int n,a,b,sum;
while(~scanf("%d%d%d" , &n , &a , &b))
{
int flag = ; if(a+b+ == n){
num[] = , sum = ;
if(b == && a>) flag = ;
for(int i= ; i<=+b ; i++)
{
num[i] = sum+ , sum += num[i];
if(num[i]>=){
flag=;
break;
}
}
for(int i=+b ; i<=n ; i++){
num[i] = num[i-]+ , sum += num[i];
if(num[i]>=){
flag=;
break;
}
} }
else{
sum = ;
num[] = , sum = ;
if(b>){
for(int i= ; i<=+b ; i++)
{
num[i] = sum+ , sum+=num[i];
if(num[i]>=){
flag=;
break;
}
}
for(int i=+b ; i<=+a+b ; i++)
{
num[i] = num[i-]+;
if(num[i]>=){
flag=;
break;
}
}
for(int i=+a+b ; i<=n ; i++)
num[i] = num[i-];
}
else{
for(int i= ; i<=n-a ; i++)
num[i] = ;
for(int i=n-a+ ; i<=n ; i++)
num[i] = num[i-]+;
}
}
if(!flag){
puts("-1");
continue;
}
for(int i= ; i<=n ; i++){
if(i==) printf("%d" , num[i]);
else printf(" %d" , num[i]);
}
puts("");
}
return ;
}
Codeforces 148D
简单的概率dp过程
用dp[0][w][b]表示后取完后游戏还未结束得到w只老鼠,b只黑鼠的概率
用dp[1][w][b]表示龙取完后游戏还未结束得到w只白鼠,b只黑鼠的概率
最后答案就是所有龙取完后游戏未结束的局面*一个后取到白鼠的概率
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = ;
double dp[][N][N]; int main()
{
// freopen("a.in" , "r", stdin);
int w , b;
while(~scanf("%d%d" , &w , &b))
{
memset(dp , , sizeof(dp));
dp[][w][b] = 1.0;
for(int i=w ; i>= ; i--){
for(int j=b ; j>= ; j--){
dp[][i][j] += dp[][i][j+]*(j+)/(i+j+);
dp[][i][j] += dp[][i][j+]*(j+)/(i+j+)*(j+)/(i+j+) + dp[][i+][j+]*(j+)/(i+j+)*(i+)/(i+j+);
}
}
double ans = ;
for(int i= ; i<=w ; i++)
for(int j= ; j<=b ; j++){
ans += dp[][i][j]*i/(i+j);
}
printf("%.10f\n" , ans);
}
return ;
}
codeforces 148E
每行书都是跟其他行没有直接关系的,求出每行书取得的个数达到的最大值
然后将n行结合在一起当成背包问题看
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int N = ;
int dp[N][N][N] , val[N][N] , sum[N][N];
int maxn[N][N] , cnt[N];
int bag[N][N*N]; int main()
{
// freopen("a.in" , "r" , stdin);
int n,m;
while(scanf("%d%d" , &n , &m) != EOF)
{
memset(dp , , sizeof(dp));
memset(maxn , , sizeof(maxn));
memset(sum , , sizeof(sum));
for(int i= ; i<=n ;i++){
scanf("%d" , &cnt[i]);
for(int j= ; j<=cnt[i] ; j++){
scanf("%d" , &val[i][j]);
sum[i][j] = sum[i][j-]+val[i][j];
for(int k= ; k<=cnt[i] ; k++){
for(int l= ; l<=k+ ; l++){
maxn[i][k] = max(maxn[i][k] , sum[i][cnt[i]]-sum[i][l+cnt[i]-k-] + sum[i][l-]);
}
}
}
}
memset(bag , , sizeof(bag));
for(int i= ; i<=n ; i++){
for(int k= ; k<=cnt[i] ; k++){
for(int j= ; j<=m ; j++){
bag[i][j] = max(bag[i][j] , bag[i-][j]);
if(j>=k)
bag[i][j] = max(bag[i][j] , bag[i-][j-k]+maxn[i][k]);
}
}
}
printf("%d\n" , bag[n][m]);
}
return ;
}
寒假训练3解题报告 CodeForces #148的更多相关文章
- ZOJ Monthly, January 2018 训练部分解题报告
A是水题,此处略去题解 B - PreSuffix ZOJ - 3995 (fail树+LCA) 给定多个字符串,每次询问查询两个字符串的一个后缀,该后缀必须是所有字符串中某个字符串的前缀,问该后缀最 ...
- cf1189解题报告
cf1189div2解题报告 codeforces A 答案要不是一串要不就是去掉最后一个字母的两串 #include <bits/stdc++.h> #define ll long lo ...
- codeforces 476C.Dreamoon and Sums 解题报告
题目链接:http://codeforces.com/problemset/problem/476/C 题目意思:给出两个数:a 和 b,要求算出 (x/b) / (x%b) == k,其中 k 的取 ...
- Codeforces Round #378 (Div. 2) D题(data structure)解题报告
题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...
- [置顶] 刘汝佳《训练指南》动态规划::Beginner (25题)解题报告汇总
本文出自 http://blog.csdn.net/shuangde800 刘汝佳<算法竞赛入门经典-训练指南>的动态规划部分的习题Beginner 打开 这个专题一共有25题,刷完 ...
- Codeforces Round 665 赛后解题报告(暂A-D)
Codeforces Round 665 赛后解题报告 A. Distance and Axis 我们设 \(B\) 点 坐标为 \(x(x\leq n)\).由题意我们知道 \[\mid(n-x)- ...
- Codeforces Round 662 赛后解题报告(A-E2)
Codeforces Round 662 赛后解题报告 梦幻开局到1400+的悲惨故事 A. Rainbow Dash, Fluttershy and Chess Coloring 这个题很简单,我们 ...
- Codeforces Educational Round 92 赛后解题报告(A-G)
Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...
- Codeforces Round #382 (Div. 2) 解题报告
CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...
随机推荐
- 求N!尾数有多少个0。
方法一:假设N!=K*10M,K不能被10整除,那么N!尾数就有M个0.再对N!进行质因子分解:N!=2x*3y*5z...由于10=2*5,即每一对2和5相乘都可以得到1个0,所以M只与指数x.z有 ...
- Oracle11g导出dmp并导入Oracle10g的操作记录
Oracle11g导出dmp并导入Oracle10g的操作记录. 操作环境说明: Oracle11g环境:Windows7,Oracle Database 11g Enterprise Edition ...
- 浏览器 cookie session
浏览器的cookie被禁用的话,则服务端的session不起作用 session是基于cookie实现的, 还是办理会员卡的问题, cookie客户端支持,即客户手上的会员卡记录了所有信息, sess ...
- UML 活动图(转载)
活动图:用于表示系统中各种活动的次序,它的应用非常广泛,即可用来描述用例的工作流程,也可用来描述类中某个方法的操作行为.常用于表示业务流程,对系统功能建模,强调对象之间的控制流.活动图是由状态图变化而 ...
- 188 Best Time to Buy and Sell Stock IV 买卖股票的最佳时机 IV
假设你有一个数组,其中第 i 个元素是第 i 天给定股票的价格.设计一个算法来找到最大的利润.您最多可以完成 k 笔交易.注意:你不可以同时参与多笔交易(你必须在再次购买前出售掉之前的股票). 详见: ...
- 使用一个CSS Class去给标签定义Style
使用一个CSS Class去给标签定义Style 类是可重用的样式,可以添加到HTML元素. 下面是一个CSS类声明的例子: <style> .blue-text { colo ...
- 掌握Spark机器学习库-02-mllib数据格式
MLlib 1.MLlib介绍 1)MLlib特点 2)哪些算法 3)阅读官方文档 MLlib提供了哪些: 算法 特征工程 管道 持久化 2.MLlib数据格式 1)本地向量 2)标签数据 3)本地矩 ...
- VM virtualBox设置无缝全屏
设置之前:
- iOS----轻松掌握AFN网络顶级框架
AFN 一.什么是AFN 全称是AFNetworking,是对NSURLConnection的一层封装 虽然运行效率没有ASI高,但是使用比ASI简单 在iOS开发中,使用比较广泛 AFN的githu ...
- SQL Server中行列转置方法
PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...