NOIP2017赛前模拟11月2日总结
分数爆炸的一天··但也学了很多
题目1:活动安排
给定n个活动的开始时间与结束时间··只有一个场地··要求保留尽量多的活动且时间不冲突···场地数n<=100000
考点:贪心
直接将结束时间按照升序排序,然后从小到大取不冲突的即可··很像hdu4343,然而我做的时候有点搞麻烦了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+;
struct node{int l,r;}q[N],a[N];
int n,stk[N],top=;
inline int R(){
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline bool cmp(node a,node b){
if(a.l==b.l) return a.r>b.r;
else return a.l<b.l;
}
inline void pre(){
sort(q+,q+n+,cmp);
for(int i=;i<=n;i++){
while(top&&q[i].l>=q[stk[top]].l&&q[i].r<=q[stk[top]].r) top--;
stk[++top]=i;
}
n=;
for(int i=;i<=top;i++) a[++n]=q[stk[i]];
}
int main(){
//freopen("arrange.in","r",stdin);
//freopen("arrange.out","w",stdout);
n=R();
for(int i=;i<=n;i++){
int h=R(),m=R();q[i].l=h*+m;
h=R();m=R();
q[i].r=h*+m;
}
pre();
int head=,tail,ans=;
while(head<=n){
if(head<=n) ans++;
else break;
tail=head+;
while(tail<=n){
if(a[tail].l>=a[head].r) break;
else tail++;
}
if(tail>n) break;
else head=tail;
}
cout<<ans<<"\n";
}
题目2:最佳序列
给定n个非负整数序列,要求找出长度大于l,小于r的区间,使得区间的平均数最大,n<=20000
考点:二分+单调队列
首先看到平均数要想到老套路:将每个值减去平均数转化成区间和大于0的问题
求最大的平均数自然想到二分··然后用单调队列判断是否有可行解即可
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=2e4+;
const double eps=1e-;
inline int R(){
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
int n,l,r,num[N],minn,maxx;
double ans=,sum[N];
inline bool jud(double k){
for(int i=;i<=n;i++) sum[i]=(double)num[i]-k,sum[i]+=sum[i-];
deque<int>que;
for(int i=l;i<=n;i++){
while(!que.empty()&&sum[que.back()]>=sum[i-l]) que.pop_back();
que.push_back(i-l);
if(sum[i]>=sum[que.front()]) return true;
while(!que.empty()&&que.front()<=i-r) que.pop_front();
}
return false;
}
int main(){
//freopen("a.in","r",stdin);
//freopen("a.out","w",stdout);
n=R(),l=R(),r=R();minn=,maxx=;
for(int i=;i<=n;i++) num[i]=R(),minn=min(minn,num[i]),maxx=max(maxx,num[i]);
double le=minn,ri=maxx;
while(ri-le>eps){
double mid=(le+ri)/;
if(jud(mid)) ans=max(ans,mid),le=mid;
else ri=mid;
}
printf("%0.4f\n",ans);
return ;
}
题目3:回文子串
给定两个串s和t··将s与t拆开后组成新的字符串,但新串的字母的顺序为原来s与t的顺序··求新串能够包含的最长回文子串长度,s与t的长度均小于50
考点:dp
哎··dp还是太弱了··开始时完全没思路
用f[i][j][k][l]表示s串从前往后已经取出了i个,从后往前已经取出了k了,t串从前往后已经取出了j个,从后往前已经取出了l个组成的字符串的最长回文子串长度
转移看代码吧··懒得写了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
char s[N],t[N];
int ans,f[N][N][N][N],n,m;
int main()
{
//freopen("a.in","r",stdin);
scanf("%s%s",s+,t+);
n=strlen(s+);m=strlen(t+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=n;k>=i-;k--)
for(int l=m;l>=j-;l--){
if(i<k&&s[i]==s[k]) f[i+][j][k-][l]=max(f[i+][j][k-][l],f[i][j][k][l]+);
if(j<l&&t[j]==t[l]) f[i][j+][k][l-]=max(f[i][j+][k][l-],f[i][j][k][l]+);
if(i<=k&&j<=l){
if(s[i]==t[l]) f[i+][j][k][l-]=max(f[i+][j][k][l-],f[i][j][k][l]+);
if(s[k]==t[j]) f[i][j+][k-][l]=max(f[i][j+][k-][l],f[i][j][k][l]+);
}
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=i;k>=i-;k--)
for(int l=j;l>=j-;l--){
if(i==k&&j>l) ans=max(ans,f[i][j][k][l]+);
if(i>k&&j==l) ans=max(ans,f[i][j][k][l]+);
if(i>k&&j>l) ans=max(ans,f[i][j][k][l]);
}
cout<<ans<<endl;
return ;
}
题目4:赌博游戏
最近西雅图的高中校园里流行这样一个游戏。
我们有一个骰子,这个骰子有M个面,分别写着1..M,并且是个公平的骰子,换句话说,一次投掷时每个面朝上的概率是相同的。
游戏的组织者使用这个骰子进行N次投掷,并且告诉玩家点数v出现了至少一次。那么玩家需要猜测N次投掷的点数之和。如果猜对了,就赢得了这个游戏。
小宇也喜欢玩这个游戏。在一次游戏中,她猜测了一个正整数sum,于是她想知道猜对的概率是多少。
数据满足:1≤N,M≤50;1≤v≤M;1≤sum≤N*M。
考点:概率dp
简单的概率dp题··用f[j][i][0/1]表示已经掷出了i次骰子,总和为j,是否掷出了v的概率
dp方程看代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
double f[][][];
int n,m,v,sum;
int main(){
//freopen("a.in","r",stdin);
scanf("%d%d%d%d",&n,&m,&v,&sum);
for(int i=;i<=m;i++){
if(i==v) f[i][][]=1.0/m;
else f[i][][]=1.0/m;
}
for(int i=;i<n;i++)
for(int j=;j<=i*m;j++)
for(int k=;k<=m;k++){
if(k!=v) f[j+k][i+][]+=f[j][i][]*1.0/m,f[j+k][i+][]+=f[j][i][]*1.0/m;
else f[j+v][i+][]+=(f[j][i][]*1.0/m+f[j][i][]*1.0/m);
}
double tot=;
for(int i=;i<=n*m;i++) tot+=f[i][n][];
printf("%0.8f",f[sum][n][]/tot);
return ;
}
NOIP2017赛前模拟11月2日总结的更多相关文章
- NOIP2017赛前模拟11月6日—7日总结
收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次 ...
- NOIP2017赛前模拟11月4日总结:
第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...
- NOIP2017赛前模拟10月30日总结
题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...
- 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦
这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...
- 11月23日《奥威Power-BI报表集成到其他系统》腾讯课堂开课啦
听说明天全国各地区都要冷到爆了,要是天气冷到可以放假就好了.想象一下大冷天的一定要在被窝里度过才对嘛,索性明天晚上来个相约吧,相约在被窝里看奥威Power-BI公开课如何? 上周奥威公开 ...
- 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦
上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...
- 11月09日《奥威Power-BI vs微软Power BI》腾讯课堂开课啦
上过奥威公开课的同学可能有一个疑问:奥威Power-BI和微软Power BI是同一个吗,为什么叫同样的名字?正如这个世界上有很多个John.Jack.Marry…一样,奥威Power-BI和微软Po ...
- 2016年11月30日 星期三 --出埃及记 Exodus 20:21
2016年11月30日 星期三 --出埃及记 Exodus 20:21 The people remained at a distance, while Moses approached the th ...
- 2016年11月29日 星期二 --出埃及记 Exodus 20:20
2016年11月29日 星期二 --出埃及记 Exodus 20:20 Moses said to the people, "Do not be afraid. God has come t ...
随机推荐
- python代码实现截图识字
有次网上down了个截图实识的软件,发现一天只能用10次要钱才能解锁免费,很气,作为一个菜鸡怎么能忍受 于是自己用python写了个简单的小工具,分享给大家 代码如下: 先安装库 from PIL i ...
- Java OOP——第八章 File IO
1.文件:文件可认为是相关记录或放在一起的数据的集合: 2.File类:名命空间:java.io File对象即可表示文件,也可表示目录, 在程序中,一个File对象可以代表一个文件或目录, 利用他可 ...
- flask-login原理详解
最近发现项目中使用的flask-login中有些bug,直接使用官网的方式确实可以用,但仅仅是可以用,对于原理或解决问题没有什么帮助,最近通过查看网上资料.分析源码.通过demo.从零开始总结了fla ...
- C语言实例解析精粹学习笔记——28
实例28:从键盘读入实数 题目要求: 编制一个从键盘读入实数的函数readreal(double *rp).函数将读入的实数字符列转换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp. 思 ...
- Android 中的一些特殊目录与文件
用作命令的二进制文件位于/system/bin/与/system/xbin/下 应用数据位于/data/data/, 原始安装文件位于/data/app/(Play商店中非免费应用位于/data/ap ...
- 邮件系统之Postfix与Dovecot
电子邮件系统 电子邮件系统基于邮件协议来完成电子邮件的传输,常见的邮件协议有: 简单邮件传输协议(Simple Mail Transfer Protocol,SMTP):用于发送和中转发出的电子邮件, ...
- 3,Linux入门
操作系统的分类 Windows系列操作系统,Unix类操作系统,Linux类操作系统,Mac操作系统 提问:为什么要去学习Linux? 同学甲可能要问,超哥你介绍了这么多有关Linux的知识,但我还是 ...
- MySQL Group Replication数据安全性保障
本文来自数据库内核专栏 在之前的文章中,介绍了MGR对数据可靠性.可用性和一致性的实现方案.简单来说,MGR通过基于paxos协议的多副本来实现数据的可靠性,通过多副本上的majority机制来实现可 ...
- 树莓派Raspberry Pi 3安装步骤
一.需要的硬件 1.Raspberry Pi 3(Model B+)树莓派.购买>https://item.jd.com/29225467867.html 2.输出5V/2A的电源 3.SD卡( ...
- 初学JS——实现基于计时器的小游戏。
这几天一直在看网易云课堂上免费的JS课程,正好今天看到讲了计时器setInterval,第一感觉就是像C#里的TIMER.然后课程里举得例子正好通过计时器改变新生成窗口的位置, 然后就突然有了灵感!可 ...