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+5;
struct node{int l,r;}q[N],a[N];
int n,stk[N],top=0;
inline int R(){
    char c;int f=0;
    for(c=getchar();c<‘0‘||c>‘9‘;c=getchar());
    for(;c<=‘9‘&&c>=‘0‘;c=getchar())    f=(f<<3)+(f<<1)+c-‘0‘;
    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+1,q+n+1,cmp);
    for(int i=1;i<=n;i++){
        while(top&&q[i].l>=q[stk[top]].l&&q[i].r<=q[stk[top]].r)    top--;
        stk[++top]=i;
    }
    n=0;
    for(int i=1;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=1;i<=n;i++){
        int h=R(),m=R();q[i].l=h*60+m;
        h=R();m=R();
        q[i].r=h*60+m;
    }
    pre();
    int head=1,tail,ans=0;
    while(head<=n){
        if(head<=n)    ans++;
        else  break;
        tail=head+1;
        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+5;
const double eps=1e-7;
inline int R(){
    char c;int f=0;
    for(c=getchar();c<‘0‘||c>‘9‘;c=getchar());
    for(;c<=‘9‘&&c>=‘0‘;c=getchar())    f=(f<<3)+(f<<1)+c-‘0‘;
    return f;
}
int n,l,r,num[N],minn,maxx;
double ans=0,sum[N];
inline bool jud(double k){
    for(int i=1;i<=n;i++)   sum[i]=(double)num[i]-k,sum[i]+=sum[i-1];
    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=1000005,maxx=0;
    for(int i=1;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)/2;
        if(jud(mid))    ans=max(ans,mid),le=mid;
        else ri=mid;
    }
    printf("%0.4f\n",ans);
    return 0;
}

题目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=55;
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+1,t+1);
    n=strlen(s+1);m=strlen(t+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=n;k>=i-1;k--)
                for(int l=m;l>=j-1;l--){
                    if(i<k&&s[i]==s[k]) f[i+1][j][k-1][l]=max(f[i+1][j][k-1][l],f[i][j][k][l]+2);
                    if(j<l&&t[j]==t[l]) f[i][j+1][k][l-1]=max(f[i][j+1][k][l-1],f[i][j][k][l]+2);
                    if(i<=k&&j<=l){
                        if(s[i]==t[l]) f[i+1][j][k][l-1]=max(f[i+1][j][k][l-1],f[i][j][k][l]+2);
                        if(s[k]==t[j]) f[i][j+1][k-1][l]=max(f[i][j+1][k-1][l],f[i][j][k][l]+2);
                    }
                }
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=i;k>=i-1;k--)
                for(int l=j;l>=j-1;l--){
                    if(i==k&&j>l) ans=max(ans,f[i][j][k][l]+1);
                    if(i>k&&j==l) ans=max(ans,f[i][j][k][l]+1);
                    if(i>k&&j>l)  ans=max(ans,f[i][j][k][l]);
                }
    cout<<ans<<endl;
    return 0;
}

题目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[2505][55][2];
int n,m,v,sum;
int main(){
    //freopen("a.in","r",stdin);
    scanf("%d%d%d%d",&n,&m,&v,&sum);
    for(int i=1;i<=m;i++){
        if(i==v)    f[i][1][1]=1.0/m;
        else f[i][1][0]=1.0/m;
    }
    for(int i=1;i<n;i++)
        for(int j=1;j<=i*m;j++)
            for(int k=1;k<=m;k++){
                if(k!=v) f[j+k][i+1][0]+=f[j][i][0]*1.0/m,f[j+k][i+1][1]+=f[j][i][1]*1.0/m;
                else f[j+v][i+1][1]+=(f[j][i][0]*1.0/m+f[j][i][1]*1.0/m);
            }
    double tot=0;
    for(int i=1;i<=n*m;i++)    tot+=f[i][n][1];
    printf("%0.8f",f[sum][n][1]/tot);
    return 0;
}
时间: 2024-08-11 15:09:59

NOIP2017赛前模拟11月2日总结的相关文章

NOIP2017赛前模拟11月6日—7日总结

收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次减去数中前c大的数·· 因此我们考虑每次减去前c大的数后依然保持数列的有序性,假设数列为111223,c=5,为了保持有序性,2和3的部分可以正常减去1,但1的话我们需要从最左边开始减··· 所以对应每次操作,我们需要找到减去的最小的数的区间··从最左边开始减···这样就能保持有序性,直接在线段树上维护区

NOIP2017赛前模拟11月4日总结:

第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· 第一次感受到了暴力的重要性··第一是想不出正解部分分是要拿的··第二是即使想出正解对拍也要用暴力··· 以后考试决定遇到一道题先只想个20分钟·如果想不出正解先把暴力打了··三道题这样弄完后再去细细想正解 题目1:区间 给定一个n个正整数的序列··q次询问两个数a,b,问序列中有多少个区间使得ab

43_2013年11月22日 线程池 Socket(Thread Lock Process 摇奖 线程池ThreadPool)

1>模拟线程池,生产者消费者问题 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace Product { class Program { static void Main(string[] args) { //创建一个池子 MyConncetion[]

平台和操作系统,是Google在2007年11月5日公布的手机系统平台,早期由Google开发,后由开放

Android是基于Linux内核[2]的软件平台和操作系统,是Google在2007年11月5日公布的手机系统平台,早期由Google开发,后由开放手机联盟(英语:Open Handset Alliance)(Open... kb.cnblogs.com/zt/andr... - 百度快照 - 91%好评 知识库_博客园 http://bbs.sssc.cn/thread-4458080-1-1.htmlhttp://bbs.sssc.cn/thread-4458079-1-1.htmlhtt

20141112,微软11月12日发布14个安全补丁

大家好,我们是微软大中华区安全支持团队. 微软于北京时间2014年11月12日发布了14个新的安全公告,其中4个为严重等级,8个为重要等级,共修复Microsoft Windows. Internet Explorer (IE). Office. .NET Framework, Internet Information Services (IIS).Remote Desktop Protocol (RDP). Active Directory Federation Services (ADFS)

2014年11月2日-11月9日 周总结

不敢相信一周的时间就这样过去了,只是简单的做了一个梦.醒来又是就是下周了. 周一周二所有的时间都是在准备地球制图的项目,周三编制制图报告.周四周五又都是在复习,准备地学信息分析与处理考试,一直都没有读书.一直到了周五晚上才有空读书.ArcGIS产品的白皮书,ENVI的产品白皮书和EV-Globe产品白皮书,粗略的浏览了一遍.又浏览了一下Matlab的帮助程序,收获很大,不过还是为了考试.值得高兴的是,计算机制图不需要考试,只需要交作品就好. 2014年11月10日-11月16日需要的事,AE二次

访问不了google的同学看过来(14年11月5日有效)

访问不了google的同学们,打开这个地址看看是什么?? 地址:https://edgecastcdn.net/00107ED/g/ 更新时间:2014年11月5日 喜大普奔阿, 访问不了的话,点此留言,随时更新 与本文相关的文章 Google开源工具nogotofail:可测试网络流量安全 Google是如何测试的(全) 微软和google的测试比较? Android SDK工具(Google提供的16个工具)简介 Android之父与Google的诀别内幕,***,google也留不住 值得

11月28日全球域名商保有量及市场份额排行榜TOP16

IDC评述网(idcps.com)12月01日报道:根据RegistrarStats公布的实时数据显示,截止至2015年11月28日,全球域名注册保有量十六强名单顺序,与上期11月21日保持一致,中国依旧占据3个席位,分别是中国万网.易名中国.新网,排名分列7..10.16名.下面,请看IDC评述网对数据的整理与分析. (图1)全球域名注册商(国际域名)保有量市场份额TOP16 如图1所示,截止至2015年11月28日,在全球域名注册市场上,GODADDY.COM份额依旧最大,第二名eNom与之

2014年11月12~11月14日,杨学明老师《软件测试管理》内训在北京某银行软件中心成功举办!

2014年11月12~11月14日,北京天气呈现少有的APEC蓝,著名研发管理专家杨学明老师为某银行提供了三天的内训服务,此次培训由两部分组成,第一部分是<软件测试管理高级实务>.第二部分是<软件测试需求分析和测试设计>,三天的培训非常紧张,包括老师讲解,案例演练,专题研讨,过程衔接非常紧密,课堂气氛也比较轻松,来自该银行核心系统和网银两个事业部的同事参加了此次培训,包括开发,需求,测试和维护人员等,课程结束后,举行了考试,大家对三天的学习进行回顾和总结,并准备把这两天学习到知识结