分数爆炸的一天··但也学了很多

题目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日总结的更多相关文章

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

    收获颇丰的两天··· 题目1:序列操作 给定n个非负整数,进行m次操作,每次操作给出c,要求找出c个正整数数并将它们减去1,问最多能进行多少操作?n,m<=1000000 首先暴力贪心肯定是每次 ...

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

    第一次挂0·····有点感伤···主要是因为时间分配太不合理了··花2个半小时搞第一题最后还wa完了··第二题很简单花了30分钟打完但没打对拍结果wa完···第三题暴力可以拿20分的但没时间打了··· ...

  3. NOIP2017赛前模拟10月30日总结

    题目1: n个人参赛(n<=100000),每个人有一个权值··已知两个人权值绝对值之差小于等于K时,两个人都有可能赢,若大于则权值大的人赢···比赛为淘汰制,进行n-1轮·问最后可能赢的人有多 ...

  4. 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦

    这么快一周就过去了,奥威公开课又要与大家见面咯,上节课老师教的三种报表集成方法你们都掌握了吗?大家都知道,学习的结果在于实际应用,想要熟练掌握新内容的要点就在于去应用它.正是基于这一要点,每一期的课程 ...

  5. 11月23日《奥威Power-BI报表集成到其他系统》腾讯课堂开课啦

    听说明天全国各地区都要冷到爆了,要是天气冷到可以放假就好了.想象一下大冷天的一定要在被窝里度过才对嘛,索性明天晚上来个相约吧,相约在被窝里看奥威Power-BI公开课如何?        上周奥威公开 ...

  6. 11月16日《奥威Power-BI基于SQL的存储过程及自定义SQL脚本制作报表》腾讯课堂开课啦

           上周的课程<奥威Power-BI vs微软Power BI>带同学们全面认识了两个Power-BI的使用情况,同学们已经迫不及待想知道这周的学习内容了吧!这周的课程关键词—— ...

  7. 11月09日《奥威Power-BI vs微软Power BI》腾讯课堂开课啦

    上过奥威公开课的同学可能有一个疑问:奥威Power-BI和微软Power BI是同一个吗,为什么叫同样的名字?正如这个世界上有很多个John.Jack.Marry…一样,奥威Power-BI和微软Po ...

  8. 2016年11月30日 星期三 --出埃及记 Exodus 20:21

    2016年11月30日 星期三 --出埃及记 Exodus 20:21 The people remained at a distance, while Moses approached the th ...

  9. 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 ...

随机推荐

  1. 注释java中某个方法过时

    添加一个注解即可 @Deprecated

  2. Java OOP——第五章 异常

    1. 尝试通过if-else来解决异常问题: Eg: public class Test2 {       public static void main(String[] args) {       ...

  3. java-反射和代理

    1.类的编译和运行简易过程: java的源码文件(也称为编译单元,以.java为后缀的文件) ↓ 文件内最多只能有一个public修饰的类,否则编译器报错:某个类被public修饰,该类名必需与文件名 ...

  4. GMT 时间格式转换到 TDateTime (Delphi)

    //GMT 时间格式转换到 TDateTime //忽略时区 function GMT2DateTime(const pSour:PAnsiChar):TDateTime; function GetM ...

  5. Python学习之编程基础

    学习Python之前首先我们要了解Python是什么? question 1:Python是什么? answer:Python是一门编程语言.(什么是编程语言?) 语言:语言是不同个体之间沟通的介质. ...

  6. [Codeforces958E2]Guard Duty (medium)(区间DP)

    Description 题目链接 Solution 可以把题目转化一下模型,将间隔取出来,转化为N-1个数,限制不能取相邻两个数,求取K个数的最小价值 设DP[i][j]表示前i个数取j个最大价值(第 ...

  7. Git-Git克隆

    鸡蛋不装在一个篮子里 Git的版本库目录和工作区在一起,因此存在一损俱损的问题,即如果删除一个项目的工作区,同时也会把这个项目的版本库删除掉.一个项目仅在一个工作区中维护太危险了,如果有两个工作区就会 ...

  8. TouTiao开源项目 分析笔记13 最后一个订阅号的实现主页面

    1.实现订阅号的基础类 1.1.本地订阅号的Bean类==>MediaChannelBean public class MediaChannelBean implements Parcelabl ...

  9. Android 游标

    静下心来,学一下Android的数据库连接. 1.直接从getReadableDatabase()与getWritableDatabase()入手.    --getReadableDatabase( ...

  10. linux命令随身记

    赋予权限命令:chmod 755 * 查询进程: ps -ef |grep abc 查看含有"abc"的活动进程 ps -ef |grep -v abc 查看不含abc的活动进程 ...