期望得分:100+0+100=200

实际得分:100+20+0=120

离散化搞搞

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 100001
int a[N],b[N];
bool vis[N];
void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
}
int main()
{
freopen("del.in","r",stdin);
freopen("del.out","w",stdout);
int n,k;
read(n); read(k);
for(int i=;i<=n;i++) read(a[i]),b[i]=a[i];
sort(b+,b+n+);
int tot=unique(b+,b+n+)-b-;
for(int i=;i<=n;i++) a[i]=lower_bound(b+,b+tot+,a[i])-b;
int cnt1=,cnt2=;
for(int i=;i<=n;i++)
if(!vis[a[i]]) vis[a[i]]=true,cnt1++;
else cnt2++;
if(k<=cnt2) printf("%d\n",cnt1);
else printf("%d\n",cnt1-(k-cnt2));
return ;
}

阅读理解之坑:加冕没有用

出题人想表达停在那儿,就是不再继续跳吃

考场上没写出来原因有二:

1、死磕加冕

2、怕TLE,写的记忆化,这种题最好先打出裸的dfs

#include<cstdio>
#include<algorithm> using namespace std; char s[];
int mp[][];
bool mp2[][],vis[][]; int cnt,mx,tot;
struct node
{
int x,y;
}ans[]; int dx[]={-,-,,};
int dy[]={-,,,-}; void init()
{
for(int i=;i<=;i++)
{
scanf("%s",s+);
for(int j=;j<=;j++) mp[i][j]=s[j]-'';
}
for(int i=;i<=;i++)
{
scanf("%s",s+);
for(int j=;j<=;j++) mp2[i][j]=s[j]-'';
}
} bool inmap(int x,int y)
{
return (!(x<=) && !(x>) && !(y<=) && !(y>));
} bool empty(int x,int y)
{
return !mp[x][y];
} bool jump(int x,int y)
{
if(!inmap(x,y)) return false;
return mp[x][y]==;
} bool have(int x,int y)
{
return vis[x][y];
} void update(int i,int j)
{
if(cnt>mx)
{
mx=cnt; tot=;
ans[].x=i; ans[].y=j;
}
else if(cnt==mx)
{
ans[++tot].x=i; ans[tot].y=j;
}
} void dfs(int x,int y,int sx,int sy)
{
vis[x][y]=true;
for(int i=;i<;i++)
if(jump(x+dx[i],y+dy[i]) && inmap(x+dx[i]+dx[i],y+dy[i]+dy[i]) && empty(x+dx[i]+dx[i],y+dy[i]+dy[i]))
{
if(have(x+dx[i],y+dy[i]) || have(x+dx[i]+dx[i],y+dy[i]+dy[i]) ) continue;
cnt++; update(sx,sy);
dfs(x+dx[i]+dx[i],y+dy[i]+dy[i],sx,sy);
cnt--;
}
vis[x][y]=false;
} void dfs2(int x,int y,int sx,int sy)
{
vis[x][y]=true;
for(int d=;d<;d++)
{
int nx=x,ny=y;
for(int i=;i<=;i++)
{
nx+=dx[d]; ny+=dy[d];
if(!inmap(nx,ny)) break;
if(mp[nx][ny]==) break;
if(!jump(nx,ny)) continue;
if(have(nx,ny)) continue;
vis[nx][ny]=true;
int nnx=nx,nny=ny;
for(int j=;j<=;j++)
{
nnx+=dx[d]; nny+=dy[d];
if(!inmap(nnx,nny)) break;
if(!empty(nnx,nny)) break;
if(have(nnx,nny)) continue;
cnt++; update(sx,sy);
dfs2(nnx,nny,sx,sy);
cnt--;
}
vis[nx][ny]=false;
}
}
vis[x][y]=false;
} void solve()
{
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(mp[i][j]==)
{
if(!mp2[i][j]) dfs(i,j,i,j);
else dfs2(i,j,i,j);
}
if(!mx)
{
cnt=;
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(mp[i][j]==)
{
if(!mp2[i][j])
{
for(int k=;k<;k++)
if(inmap(i+dx[k],j+dy[k]) && empty(i+dx[k],j+dy[k])) update(i,j);
}
else
{
for(int k=;k<;k++)
{
int nx=i,ny=j;
for(int l=;l<=;l++)
{
nx+=dx[k];ny+=dy[k];
if(!inmap(nx,ny)) break;
if(!empty(nx,ny)) break;
update(i,j);
}
}
}
} }
printf("%d\n",tot);
for(int i=;i<=tot;i++) printf("(%d,%d)\n",ans[i].x,ans[i].y);
}
int main()
{
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
init();
solve();
}

考场上顺退概率DP+拓扑排序,全WA了。。

正解倒推

dp[i][j]表示还有i个馅饼没有掉下来,当前还差状态为j的馅饼的期望美味度

(还差状态为j的馅饼指的是 还有状态为j的馅饼没有吃到)

枚举当前要掉哪类馅饼

如果能吃,那就从吃和不吃里选最优解

如果不能吃,那就直接又后面转移

所以 状态转移方程(设当前正掉下第l类的馅饼)

if((j&pre[l])==pre[l]) dp[i][j]+=max(dp[i+1][j],dp[i+1][j|(1<<l-1)]+val[l]);
else dp[i][j]+=dp[i+1][j];

因为是期望,不要忘了除n

最后应该输出dp[0][0]

代码中因为是从n开始枚举的,所以输出了dp[1][0]

(感谢cyz020202 指出)

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define K 101
#define N 16 int bit[N];
int val[N],pre[N];
double dp[K+][<<N+]; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} int main()
{
freopen("bonus.in", "r", stdin);
freopen("bonus.out", "w", stdout);
int k,n,x;
read(k); read(n);
bit[]=;
for(int i=;i<=n;i++) bit[i]=bit[i-]<<;
for(int i=;i<=n;i++)
{
read(val[i]);
read(x);
while(x) pre[i]+=bit[x-],read(x);
}
int S=<<n;
for(int i=k;i;i--)
for(int j=;j<S;j++)
{
for(int l=;l<=n;l++)
if((j&pre[l])==pre[l]) dp[i][j]+=max(dp[i+][j],dp[i+][j|bit[l-]]+val[l]);
else dp[i][j]+=dp[i+][j];
dp[i][j]/=1.0*n;
}
printf("%.6lf",dp[][]);
}

2017北京国庆刷题Day7 morning的更多相关文章

  1. 2017北京国庆刷题Day7 afternoon

    期望得分:100+30+100=230 实际得分:60+30+100=190 排序去重 固定右端点,左端点单调不减 考场上用了二分,没去重,60 #include<cstdio> #inc ...

  2. 2017北京国庆刷题Day1 afternoon

    期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目 ...

  3. 2017北京国庆刷题Day5 afternoon

    期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...

  4. 2017北京国庆刷题Day3 morning

    期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...

  5. 2017北京国庆刷题Day2 afternoon

    期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有一 ...

  6. 2017北京国庆刷题Day2 morning

    期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK ...

  7. 2017北京国庆刷题Day4 morning

    期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...

  8. 2017北京国庆刷题Day5 morning

    期望得分:0+60+60=120 实际得分:0+30+60=90 令g=gcd(X11,X12,X13……) 则行列式可能为D的充要条件为g|D 1.g|D为必要条件: 由定义来算行列式的时候,每一项 ...

  9. 2017北京国庆刷题Day4 afternoon

    期望得分:100+100+0=200 实际得分:5+0+0=5 每加入一个数,x的因数位置++ 注意:根号x枚举时,如果x是完全平方数,根号x会重复累计2次,要减去 考场上没减,5分 /(ㄒoㄒ)/~ ...

随机推荐

  1. 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息

    项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...

  2. Hibernate:工作原理

    Hibernate的工作原理图如下所示:

  3. nexus在linux上搭建

    Maven 仓库的分类:(maven的仓库只有两大类) 1.本地仓库 2.远程仓库,在远程仓库中又分成了3种: 2.1 中央仓库 2.2 私服 2.3 其它公共库 有个maven私服可以很方便地管理我 ...

  4. 爬虫学习之-xpath

    1.XPATH使用方法 使用XPATH有如下几种方法定位元素(相比CSS选择器,方法稍微多一点): a.通过绝对路径定位元素(不推荐!) WebElement ele = driver.findEle ...

  5. 微信小程序组件 自定义单选

    <view class='userperson'> <view class='f30 flexca'>请选择您的注册身份</view> <view class ...

  6. PHP中与类有关的运算符

    与类有关的运算符: new, instanceof:判断一个“变量”(对象,数据),是否是某个类的“实例”: 示意如下: class  A {} class  B {} class  C extend ...

  7. sqlserver-触发器-判断更新了哪个字段。

    create trigger 触发器名称on 表名(将触发器创建到那张表中)for updateasif update(判断更新字段)beginupdate (要更新的表名) set 字段=inser ...

  8. bootstrap 中的静态模式的控制按钮上的一个坑

    在使用modal时发现,代码:<button class="btn btn-danger" data-toggle="modal" data-target ...

  9. Java内存区域介绍

    Java虚拟机把内存划分成几个区域,每个区域都有各自的职责.下面将逐一分析每个区域. 有助于我们了解,每个方法,变量,对象等都去哪儿了! 程序计数器: 它占用一块很小的内存空间,可以看作是当前线程所执 ...

  10. 关于监听与控制设备旋转全解析(UIDeviceOrientationDidChangeNotification)

    一类情况: 初始化app的方向,比如只支持横屏或者竖屏.下面举例只支持竖屏的案例 在app的属性里面手动设置 上面标注了该app支持的方向种类,要是在app里支持Portrait方向,还需要添加以下代 ...