7.16 NOIP模拟测试4 礼物+通讯+奇袭
T1 礼物
题目大意:n个物品,每次有pi的概率买到,可以重复买,也可以什么都没买到,但算一次购买,问把所有东西都买到的期望次数。对于10%的数据,N = 1;对于30%的数据,N ≤ 5;对于100%的数据,N ≤ 20 ,0 < Wi ≤ 10^9 ,0 < Pi ≤ 1且∑Pi ≤ 1
刚看到这道题,我去,概率与期望,心凉了一半(太菜了。。)放到了最后做。
n很小,所以考虑状压,f[i]表示当前n种物品的状态为i的期望购买次数,0表示买了,1表示没买(我正好跟别人反着QAQ),根据以往期望题的惯例,考虑倒着转移,所以f[i]就是状态为i,到全买到的期望购买次数。f[0]表示全买了,到全买的期望是0,f[1<<n+1)-1]表示都没买,即最终答案。
转移方程就是f[i]=Σ(f[j]+1)*p[k]+(1-Σp[k])*(f[i]+1) j比i多一个0就是多买到一种,k就是那种物品
意思就是从f[j]转移的期望与这次购买什么都没买到或买到了重的的期望,Σp[k]表示买到新物品的概率,1-Σp[k]就是买旧的或不买,这是状态不会改变,从f[i]转移过来。
两边都有f[i],高斯消元?假的,移一下项就得到了f[i]=Σf[j]*p[k]/Σp[k].
考试的时候推式子没有考虑买一样的东西,期望题真是弱爆了,而且n==1那个点也没想到要输出1/p[1] 谁知道想啥呢,而且考试时一个题思路不是很清晰而且样例一直过不去,做了1小时以上了,就先把它放一放,努力拿最高分。
#include<iostream>
#include<cstdio>
#define ll long long
using namespace std;
int n,b[(<<)+];
ll w[],ans;
double p[],pp,pi,f[(<<)+];
int lowbit(int x)
{
return x&(-x);
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lf%lld",&p[i],&w[i]);
if(p[i]>) ans+=w[i];
}
printf("%lld\n",ans);
for(int i=;i<=n;i++){
b[<<i]=i;
}
for(int i=;i<=(<<n+)-;i++){
double h=;
for(int j=i;j;j-=lowbit(j)){
int tmp=lowbit(j);
f[i]+=f[i-tmp]*p[b[tmp]];
h+=p[b[tmp]];
}
if(h) f[i]=(f[i]+)/h;
}
printf("%.3lf\n",f[(<<n+)-]);
return ;
}
礼物
T2 通讯
题意:以0为起点的一张带权有向图,保证联通,有环的话环里的边权可以忽略,有重边,求从0开始遍历整张图的最小代价。
题解:有环而且可以忽略,tarjan缩点再建新图就可以,然后贪心的从每个点的入边里选一条最小的连上。(其实就考了一个tarjan的模板)
考试的时候一直在想最小生成树,但是最小生成树只适用于无向图,无向图并不适用,反例很好举。结果wa10,直接导致这次考试崩掉,以后一定要注意每种算法的适用条件。
真的很水,考完试5分钟A掉。。。。。。。。考试的时候为什么打不出来呢。。。(想扇自己)
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
struct node
{
int x,to,nxt,w;
}h[];
struct h
{
int x,to,nxt,w;
}t[];
int n,m,rt,mm,top,cnt,num,dfn[],low[],s[],whos[],tot,nxt[],fa[],tet,nx[],ans[],in[];
bool is[];
ll as;
int read()
{
int aa=,bb=;char cc=getchar();
while(cc>''||cc<''){if(cc=='-') bb=-;cc=getchar();}
while(cc<=''&&cc>=''){aa=aa*+cc-'';cc=getchar();}
return aa*bb;
}
void init()
{
top=as=cnt=num=tot=tet=;
memset(nxt,,sizeof(nxt));
memset(nx,,sizeof(nx));
memset(ans,0x5f,sizeof(ans));
for(int i=;i<=n;i++){
dfn[i]=;low[i]=;is[i]=;in[i]=;
}
}
int min(int x,int y)
{
return x<y?x:y;
}
void add(int x,int y,int w)
{
h[++tot].to=y;
h[tot].w=w;
h[tot].nxt=nxt[x];
nxt[x]=tot;
h[tot].x=x;
}
void insert(int x,int y,int w)
{
t[++tet].to=y;
t[tet].w=w;
t[tet].nxt=nx[x];
nx[x]=tet;
t[tet].x=x;
}
void tarjan(int x)
{
dfn[x]=low[x]=++cnt;
s[++top]=x;is[x]=;
for(int i=nx[x];i;i=t[i].nxt){
int y=t[i].to;
if(!dfn[y]){
tarjan(y);
low[x]=min(low[x],low[y]);
}
else if(is[y]) low[x]=min(low[x],dfn[y]);
}
if(low[x]==dfn[x]){
num++;
while(){
int tmp=s[top--];
is[tmp]=;
whos[tmp]=num;
if(tmp==x) break;
}
}
}
bool cmp(node a,node b)
{
return a.w<b.w;
}
void dfs(int x)
{
for(int i=nxt[x];i;i=h[i].nxt){
int y=h[i].to;//cout<<h[i].w<<endl;
ans[y]=min(ans[y],h[i].w);
dfs(y);
}
}
int main()
{
while(){
n=read();m=read();
init();
if(n==&&m==) break;
int u,v,w;
for(int i=;i<=m;i++){
u=read();v=read();w=read();
u++,v++;
insert(u,v,w);
}
for(int i=;i<=n;i++){
if(!dfn[i]) tarjan(i);
}
for(int i=;i<=n;i++){
for(int j=nx[i];j;j=t[j].nxt){
int y=t[j].to;
if(whos[y]!=whos[i]){
add(whos[i],whos[y],t[j].w);
in[whos[y]]++;
}
}
}
for(int i=;i<=num;i++){
if(!in[i]){
rt=i;
break;
}
}
dfs(rt);ans[rt]=;
for(int i=;i<=num;i++){
as+=ans[i];
}
printf("%lld\n",as);
}
return ;
}
通讯
T3 奇袭
题意:n*n的一张图,每行每列保证有且仅有一个军队,如果有一个k×k的区域里面恰有k个军队,危险程度就+1,求这张图的危险程度。对于30%的数据,N ≤ 100;对于60%的数据,N ≤ 5000;对于100%的数据,N ≤ 50000
题解:因为每行每列保证有且仅有一个军队,所以可以把整张图“拍扁”,a[x][y]=1-->a[x]=y;n方的复杂度这题抗不住,听说减减枝可以卡到91,之后就卡不动了。。
正解是分治或线段树,我打的是分治。
对于一个区间,可以对答案做贡献的条件就是序列是连续的(但顺序可以是乱的),即max-min=k-1。这个区间对答案的贡献可以分为3部分,mid左边,mid右边,横跨mid。mid左右的直接分治就行,关键就在与横跨mid的那部分。
横跨mid又可以分为4中情况max min都在mid左,max min都在mid右,min在mid左max在mid右,max在mid左min在mid右。发现1 2,3 4是对称的,所以只说一种。
max min都在mid左:lmax[l]-lmin[l]+1=r-l+1 发现枚举左端点就可以得到右端点,判断一下右端点是否合法就可以了;
min在mid左max在mid右:rmax[R]-lmin[L]=R-L 移项得rmax[R]-R=lmin[L]-L 用桶存符合情况rmax[R]-R,用左边拿出来就行;判是否符合情况的思想有点类似与单调队列的思想,rmax等数组存的是前缀max或min,具有单调性。注意判R的时候只能用min卡,因为如果rmax[R]>lmax[L],那么a[R]<lmax[l]这种情况在rmax中没有体现,但他却是不合法的;用rmin[R]>lmin[l]的话,一旦a[R]<lmin[l],rmin[R]中也会体现,可以卡住。L同理。
枚举左端点,越往右走lmin越大,lmax越小,就要求R的rmin增大已使继续满足lmin<rmin 所以让R左移同时排除不符合的情况,而对L的rmax的限制就有所放宽,可以稍小一些,所以L也左移,同时把符合的放进去。最后用ans+=t[lmin[L]-L]。值得注意的是,桶里的个数可能是负的,即没有符合的情况,所以加ans的时候需要判一下是否>0。而负的对以后更新没有任何影响,不用管他就行了。
桶的下标可能会出负数,统一+n就可以避免这种情况了。
清空桶的时候不要用memset,因为太慢了,还是手清吧。。
再一个卡我的地方就是进出桶的时候判断下一个是否合法,所以范围应该是开区间,最多到倒数第二个,不然倒数第一个怎么判
奇袭
7.16 NOIP模拟测试4 礼物+通讯+奇袭的更多相关文章
- 2019.8.3 [HZOI]NOIP模拟测试12 C. 分组
		
2019.8.3 [HZOI]NOIP模拟测试12 C. 分组 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 刚看这题觉得很难,于是数据点分治 k只有1和2两种,分别 ...
 - 10.16 NOIP模拟赛
		
目录 2018.10.16 NOIP模拟赛 A 购物shop B 期望exp(DP 期望 按位计算) C 魔法迷宫maze(状压 暴力) 考试代码 C 2018.10.16 NOIP模拟赛 时间:2h ...
 - 「题解」NOIP模拟测试题解乱写II(36)
		
毕竟考得太频繁了于是不可能每次考试都写题解.(我解释个什么劲啊又没有人看) 甚至有的题目都没有改掉.跑过来写题解一方面是总结,另一方面也是放松了. NOIP模拟测试36 T1字符 这题我完全懵逼了.就 ...
 - 2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色
		
2019.8.3 [HZOI]NOIP模拟测试12 B. 数颜色 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 数据结构学傻的做法: 对每种颜色开动态开点线段树直接维 ...
 - 2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci)
		
2019.8.3 [HZOI]NOIP模拟测试12 A. 斐波那契(fibonacci) 全场比赛题解:https://pan.baidu.com/s/1eSAMuXk 找规律 找两个节点的lca,需 ...
 - NOIP模拟测试17&18
		
NOIP模拟测试17&18 17-T1 给定一个序列,选取其中一个闭区间,使得其中每个元素可以在重新排列后成为一个等比数列的子序列,问区间最长是? 特判比值为1的情况,预处理比值2~1000的 ...
 - 2019.8.9 NOIP模拟测试15 反思总结
		
日常爆炸,考得一次比一次差XD 可能还是被身体拖慢了学习的进度吧,虽然按理来说没有影响.大家听的我也听过,大家学的我也没有缺勤多少次. 那么果然还是能力问题吗……? 虽然不愿意承认,但显然就是这样.对 ...
 - NOIP模拟测试1(2017081501)
		
好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...
 - 「题解」NOIP模拟测试题解乱写I(29-31)
		
NOIP模拟29(B) T1爬山 简单题,赛时找到了$O(1)$查询的规律于是切了. 从倍增LCA那里借鉴了一点东西:先将a.b抬到同一高度,然后再一起往上爬.所用的步数$×2$就是了. 抬升到同一高 ...
 
随机推荐
- set -x 与 set +x
			
set -x 与 set +x 在liunx脚本中可用set -x就可有详细的日志输出.免的老是要echo了 下面的网上搜来的用法. 用于脚本调试.set是把它下面的命令打印到屏幕set -x 是开启 ...
 - 三、Spring注解之@Import
			
spring注解之@Import [1]@Import  参数value接收一个Class数组,将你传入的类以全类名作为id加入IOC容器中  比较简单,此处不做详细解释 [2]ImportSel ...
 - 如何给gridControl动态的添加合计
			
for (int i = 0; i < this.dsHz.Tables[0].Columns.Count; i++) { if (dsHz.Tables[0].Columns[i].DataT ...
 - nginx 日志配置log_format用法
			
nginx服务器日志相关指令主要有两条: 1.一条是log_format,用来设置日志格式: 2.另外一条是access_log,用来指定日志文件的存放路径.格式和缓存大小,可以参加ngx_http_ ...
 - Lambda 表达式构建初级示例(不完整)
			
直接贴代码了: using System; using System.Collections.Generic; using System.Linq; using System.Linq.Express ...
 - Spring Cloud Sleuth+ZipKin+ELK服务链路追踪(七)
			
序言 sleuth是spring cloud的分布式跟踪工具,主要记录链路调用数据,本身只支持内存存储,在业务量大的场景下,为拉提升系统性能也可通过http传输数据,也可换做rabbit或者kafka ...
 - VS2019打开旧项目导致引用失效的解决方案
			
用VS2019打开VS2015创建的MVC项目时所有引用全部失效: 解决方案: 打开项目的csproj文件,删除 Target节点,在重新打开项目. <Target Name="Ens ...
 - Delphi Webbrowser使用方法详解
			
1.webbroser介绍 该组件是一个浏览器组件,可以显示一个指定地址的网页.设置网页打开时的主页以及对网页进行相关的操作,同时也可以对HTML文件进行剪切.复制.粘贴.删除等操作.该 组件在Int ...
 - 对于不返回任何键列信息的 SelectCommand,不支持 DeleteCommand 的动态 SQL 生成
			
VS新增操作数据库出现如下报错. 原因是数据库表未添加主键 MySQL: CREATE TABLE Customer (SID integer, Last_Name ), First_Name ), ...
 - 如何优雅地处理Async/Await的异常?
			
译者按: 使用.catch()来捕获所有的异常 原文: Async Await Error Handling in JavaScript 译者: Fundebug 本文采用意译,版权归原作者所有 as ...