2017北京国庆刷题Day7 morning
期望得分: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的更多相关文章
- 2017北京国庆刷题Day7 afternoon
期望得分:100+30+100=230 实际得分:60+30+100=190 排序去重 固定右端点,左端点单调不减 考场上用了二分,没去重,60 #include<cstdio> #inc ...
- 2017北京国庆刷题Day1 afternoon
期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目 ...
- 2017北京国庆刷题Day5 afternoon
期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...
- 2017北京国庆刷题Day3 morning
期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...
- 2017北京国庆刷题Day2 afternoon
期望得分:100+100+50=250 实际得分:100+70+50=220 T1 最大值(max) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一 ...
- 2017北京国庆刷题Day2 morning
期望得分:100+100+40=240 实际得分:100+40+0=140 T1 一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK ...
- 2017北京国庆刷题Day4 morning
期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...
- 2017北京国庆刷题Day5 morning
期望得分:0+60+60=120 实际得分:0+30+60=90 令g=gcd(X11,X12,X13……) 则行列式可能为D的充要条件为g|D 1.g|D为必要条件: 由定义来算行列式的时候,每一项 ...
- 2017北京国庆刷题Day4 afternoon
期望得分:100+100+0=200 实际得分:5+0+0=5 每加入一个数,x的因数位置++ 注意:根号x枚举时,如果x是完全平方数,根号x会重复累计2次,要减去 考场上没减,5分 /(ㄒoㄒ)/~ ...
随机推荐
- struts2--文件上传大小
Struts2文件上传的大小限制问题 问题:上传大文件报错-- 解决:修改struts.xml文件中的参数如下 <constant name="struts.multipart.max ...
- css3 伪元素 ::before ::after
键代码分析: /*css代码*/ .effect::before, .effect::after{ content:""; position:absolute; z-index:- ...
- 第六周PSP &进度条
团队项目PSP 一.表格: C类型 C内容 S开始时间 E结束时间 I时间间隔 T净时间(mins) 预计花费时间(mins) 讨论 讨论alpha完成情况并总结 9:40 11:20 17 ...
- PHP对象的遍历
对象的遍历 对象的遍历,跟数组的遍历,一样! 其实,只能遍历出对象的“实例属性数据” foreach( $对象名 as $key => $value){ //这里就可以处理$key和$va ...
- 【数据库】同一字段根据不同条件更新的sql语句的写法
语法: update test set 字段1=case when 条件1 then 值1 when 条件2 then 值2 end 示例: update PMS_ProjectInfo set Pr ...
- 【Python】第一篇:python基础_1
本篇内容 Python介绍 安装 第一个程序(hello,world) 变量 用户输入(input) 数据类型 数据运算 if判断 break和continue的区别 while 循环 一. Pyth ...
- hihocoder 1828 Saving Tang Monk II (DP+BFS)
题目链接 Problem Description <Journey to the West>(also <Monkey>) is one of the Four Great C ...
- 用PHP写出显示客户端IP与服务器IP的代码
打印客户端IP: echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’); 打印服务器IP: echo gethostbyname(“www.b ...
- 【数据库_Postgresql】sql语句添加序号,timestamp格式时间截取日期和时间
SELECT ROW_NUMBER() OVER (ORDER BY sr.receiptid ASC) AS 序号, sr.receiptid, sr.receiptdate, DATE(sr.re ...
- BZOJ4975 区间翻转
这个范围给的很像区间dp之类的,想了半天没一点思路,滚去看了一眼status被吓傻了.然后瞎猜了一发结论就过掉了. 求出逆序对数,判断是否为奇数即可.因为翻转区间会把将这段区间的逆序对取反,而长度为4 ...