期望得分: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. Ubuntu命令行安装显卡驱动

    1. sudo apt-et purge nvidia* 卸载原有驱动 2. sudo add-apt-repository ppa:graphics-drivers sudo apt-get upd ...

  2. ASP.NET MVC 4 内容映射

    文章:ASP.NET MVC 4 内容映射 地址:https://msdn.microsoft.com/zh-cn/library/gg416514(v=vs.108).aspx 模型-视图-控制器 ...

  3. Myeclipse错误:Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project ...解决方法

    解决办法:1.首先关闭MyEclipse工作空间.2.然后删除工作空间下的“/.metadata/.plugins/org.eclipse.core.runtime/.settings/com.gen ...

  4. TCP系列43—拥塞控制—6、Congestion Window Validation(CWV)

    一.概述 在RFC2861中,区分了TCP连接数据传输的三种状态   After sending a data segment:       If tcpnow - T_last >= RTO ...

  5. 一些有趣的erlang项目

    这里会收集一些erlang项目,有需可以转. erlang-bookmarks Scaling Erlang High Performance Erlang - Finding Bottlenecks ...

  6. 用iptables做代理

    出于安全考虑,Linux系统默认是禁止数据包转发的.配置Linux系统的ip转发功能,打开系统转发功能:echo "1" > /proc/sys/net/ipv4/ip_fo ...

  7. 【.Net】win10 uwp unix timestamp 时间戳 转 DateTime

    有时候需要把网络的 unix timestamp 转为 C# 的 DateTime ,在 UWP 可以如何转换? 转换函数可以使用下面的代码 private static DateTime UnixT ...

  8. POJ3709_K-Anonymous Sequence

     题意很简单,给你若干个数字,你需要减去一些数字,使得在数列中的每个数字出现的次数不少于k次. 一开始我们都会想到是用DP,于是很快我们就可以得出状态为搞定前面i个数所需要花费的最小代价用f[i]表示 ...

  9. 51nod 1804 小C的多边形(构造)

    首先可以算出无解的充分不必要条件,所有边的和为sum=3*((n-1)*n)/2,如果sum%n!=0显然无解. 也就是说n为奇数必然无解.现在考虑n为偶数的情况. 不妨假设n为偶数有解,现在考虑如何 ...

  10. Java日期格式转换

    Java时间格式转换大全 import java.text.*;import java.util.Calendar;public class VeDate {/**   * 获取现在时间   *    ...