DAY2共三题:

  • 比赛(概率)

  • 数学考试(前缀和与思维)

  • 简单瞎搞题(dp)

视频讲解:https://www.bilibili.com/video/BV1hP411o7RD/

作者:Eriktse

简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法!️欢迎关注我,一起交流C++/Python算法。(优质好文持续更新中……)

个人博客:www.eriktse.com

比赛

  • tag: 概率

传送门:https://ac.nowcoder.com/acm/problem/14734

我们设对于每一道题:

  • 事件A:自己做对了

  • 事件B:听左边的,做对了

  • 事件C:听右边的,做对了

三个事件的概率都已经给出了,分别是$P(A), P(B), P(C)$。

设事件Y:该题做对了

我们可以知道事件$Y=A \cup B \cup C$,如果要正向求解$Y$是有一定难度的,因为这里的$Y$实际上由7个最小项构成,而事件$\overline{Y}$仅有一个最小项构成(这里就不展开说了)。

容易得到表达式:

$$P(Y) = 1 - (1-P(A))(1-P(B))(1-P(C))$$

然后我们可以枚举所有的序列,然后算一下当前这个情形对答案的贡献。

枚举序列可以用二进制数枚举,也可以用dfs,用dfs的话有个好处就是可以剪枝

二进制枚举可能常数小点。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 20;
double a[maxn], b[maxn], c[maxn]; double ans[maxn]; double getp(int k)
{
return max(0.0, 1.0 - (1 - a[k]) * (1 - b[k]) * (1 - c[k]));
} void dfs(int dep, int cnt, double p)
{
if(p == 0)return;
if(dep == 13)
{
ans[cnt] += p;
return;
} //没对第i题
dfs(dep + 1, cnt, p * (1.0 - getp(dep)));
//对了第i题
dfs(dep + 1, cnt + 1, p * getp(dep));
} signed main()
{
for(int i = 1;i <= 12; ++ i)scanf("%lf", a + i);
for(int i = 1;i <= 12; ++ i)scanf("%lf", b + i);
for(int i = 1;i <= 12; ++ i)scanf("%lf", c + i);
//for(int i = 1;i <= 12; ++ i)printf("p[%lld] = %.2lf\n", i, getp(i)); dfs(1, 0, 1); for(int i = 0;i <= 12; ++ i)printf("%.6f\n", ans[i]); return 0;
}

数学考试

  • tag: 前缀和,思维

传送门:https://ac.nowcoder.com/acm/problem/15553

这道题比较简单,我们先处理出一个前缀和,然后从后往前去枚举左区间的左端点,然后更新答案即可。不需要知道具体的右区间,只需要知道右区间和取值的最值即可。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2e5 + 9, inf = 8e18; int a[maxn], prefix[maxn]; void solve()
{
int n, k;scanf("%lld %lld", &n, &k);
for(int i = 1;i <= n; ++ i)scanf("%lld", a + i);
for(int i = 1;i <= n; ++ i)prefix[i] = prefix[i - 1] + a[i]; int ans = -inf;
int mx = prefix[n] - prefix[n - k];
for(int i = n - 2 * k + 1;i >= 1; -- i)
{
//将[i, i + k - 1]区间作为左区间更新答案
ans = max(ans, mx + prefix[i + k - 1] - prefix[i - 1]);
//将区间[i + k - 1, i + 2 * k - 1]添加进右区间的集合中取大
mx = max(mx, prefix[i + 2 * k- 1] - prefix[i + k - 1]);
}
printf("%lld\n", ans);
} signed main()
{
int _;scanf("%lld", &_);
while(_ --)solve();
return 0;
}

简单瞎搞题

  • tag: dp,bitset

传送门:https://ac.nowcoder.com/acm/problem/17193

不会使用bitset的同学可以看这篇文章:https://www.eriktse.com/technology/1073.html

我们定义一个bitset b,其中b[i]若为1表示可以组成平方和为i的答案。

注意这里要用一个全0的新bitset s来存下b左移后的结果,然后再让b = s,否则可能会出现大量的错误计算。

背包dp,具体看代码吧不难理解。

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e6 + 9; signed main()
{
int n;scanf("%lld", &n);
bitset<maxn> b;
b[0] = 1; for(int i = 1;i <= n; ++ i)
{
int l, r;scanf("%lld %lld", &l, &r);
bitset<maxn> s;
for(int j = l;j <= r; ++ j)
{
s |= (b << (j * j));
}
b = s;
}
printf("%lld\n", b.count());
return 0;
}

本文由eriktse原创,创作不易,如果对您有帮助,欢迎小伙伴们点赞、收藏、留言

【ACM算法竞赛日常训练】DAY2题解与分析【比赛】【数学考试】【简单瞎搞题】的更多相关文章

  1. 【经验总结】Java在ACM算法竞赛编程中易错点

    一.Java之ACM易错点 1. 类名称必须采用public class Main方式命名 2. 在有些OJ系统上,即便是输出的末尾多了一个“ ”,程序可能会输出错误,所以在我看来好多OJ系统做的是非 ...

  2. ACM算法竞赛:抄课文

    题目如下: 比如现在要写一句话 Hello world 输入: n (n > 0) 比如输入的n为10,就将Hello world打印十 #include <stdio.h> #in ...

  3. 华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

    题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也需要用质 ...

  4. 算法竞赛入门经典训练指南——UVA 11300 preading the Wealth

    A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...

  5. 浙江省第十六届大学生ACM程序设计竞赛部分题解

    E .Sequence in the Pocket sol:将数组copy一份,然后sort一下,找寻后面最多多少个元素在原数组中保持有序,用总个数减去已经有序的就是我们需要移动的次数. 思维题 #i ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  8. 2015浙江财经大学ACM有奖周赛(一) 题解报告

    2015浙江财经大学ACM有奖周赛(一) 题解报告 命题:丽丽&&黑鸡 这是命题者原话. 题目涉及的知识面比较广泛,有深度优先搜索.广度优先搜索.数学题.几何题.贪心算法.枚举.二进制 ...

  9. 2017年浙江理工大学程序设计竞赛校赛 题解&源码(A.水, D. 简单贪心 ,E.数论,I 暴力)

    Problem A: 回文 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1719  Solved: 528 Description 小王想知道一个字 ...

  10. Aho-Corasick automaton(AC自动机)解析及其在算法竞赛中的典型应用举例

    摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用 ...

随机推荐

  1. WEB攻击与防御技术 pikachu——关于暴力破解

    首先打开XAMPP 然后在网上下载pikachu平台压缩包 解压缩即可.之后进入到XAMPP的文件夹 将pikachu文件夹放到htdoces内就完成了pikachu平台的搭建~ 之后在xampp中点 ...

  2. vcsa7 页面出现“no healthy upstream”处理过程

    一.昨天服务器出现"no healthy upstream"错误无法登录,搜索网络给出一下的思路: 对于"no healthy upstream"的错误提示,可 ...

  3. C#——》创建Windows服务,发布并调试Windows服务

    一,创建一个windows服务项目.  二,双击Service1.cs进入设计界面,在空白处右键单击选择添加安装程序,如下图所示. 三,添加安装程序后,会进入如下图界面,生成两个组件:serviceP ...

  4. java mysql删除表中多余的重复记录(多个字段),只留有id最小的记录

    mysql 删除表中多余的重复记录(多个字段),只留有id最小的记录 DELETE FROM 表1 f WHERE (f.字段1,f.字段2) IN ( SELECT 字段1,字段2 FROM 表1 ...

  5. OSIDP-虚拟内存-08

    硬件和控制结构 实际内存管理特点 1.一个进程可以在执行过程中换入换出内存,因而在内存中的位置可以不断变化. 2.一个进程可以划分为多个块,这些块位于内存中的地址不需要是连续的. 进程执行的任何时候都 ...

  6. STL练习-排列2

    Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数. Input 每组数据占一行,代表四张卡片上的数字(0<=数字<=9 ...

  7. 如何在Windows下使用WebMatrix+IIS开发PHP程序

    最近接收一个新项目,领导要求对客户端的接口采用PHP开发,为了方便,我就采用 Windows7专业版64位 + IIS7.5 + PHP5.5 + WebMatrix 作为开发环境进行开发: 首先下载 ...

  8. Selenium显式、隐式等待

    显式等待: 显式等待是你在代码中定义等待一定条件发生后再进一步执行你的代码.简单的说就是在指定时间内,一直等待某个条件成立,条件成立后立即执行定位元素的操作:如果超过这个时间条件仍然没有成立,则会抛出 ...

  9. 解决git仓库项目 添加到github非空仓库冲突问题 error: failed to push some refs to 'https://github.com/Qtoken/......'

    error: failed to push some refs to 'https://github.com/Qtoken/......' 1. 问题描述:执行命令:git push origin m ...

  10. spacy词向量

    spaCy能够比较两个对象,并预测它们的相似程度. 预测相似性对于构建推荐系统或标记重复项很有用. 例如,您可以建议与当前正在查看的用户内容相似的用户内容,或者将支持凭单标记为与现有内容非常相似的副本 ...