【jzoj】2018.2.7NOIP普及组——某【BC】组模拟赛

前言

……终于改完了,像之前小L一样崩溃。今天C组和B组一起做题,所以……


正题


题目1:教主的花园(jzoj1792)

一平面直角坐标系,在x轴的位置建立一堵墙,墙上有n道门,给出门的位置,询问两个坐标的距离(曼哈顿)。

输入输出(建议无视)

Input

输入的第1行为一个正整数N,为屏障上入口的个数。
第2行有N个整数,a1, a2, …, aN,之间用空格隔开,为这N个入口的横坐标。
第3行为一个正整数M,表示了M个询问。
接下来M行,每行4个整数x1, y1, x2, y2,有y1与y2均不等于0,表示了一个询问从(x1, y1)到(x2, y2)的最短路。

Output

输出共包含m行,第i行对于第i个询问输出从(x1, y1)到(x2, y2)的最短路距离是多少。

Sample Input

2
2 -1
2
0 1 0 -1
1 1 2 2

Sample Output

4
2

解题思路

有三种情况
1. 坐标之间不隔墙
2. 坐标之间隔墙,并且最近的墙在两个坐标之间:
草图
3. 坐标之间隔墙,并且最近的墙在两个坐标之间
草图
然后前两种情况之接输出曼哈顿距离,第三种情况输出两个距离门的距离和。
用二分确定最近的门

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[100001],m,x,y,zx,zy,l,r,mid,last;
bool ok;
int abs(int x)
{if (x<0) return 0-x;else return x;
}
int main()
{scanf("%d",&n);for (int i=1;i<=n;i++)scanf("%d",&a[i]);sort(a+1,a+1+n);//排序scanf("%d",&m);for (int i=1;i<=m;i++){scanf("%d%d%d%d",&x,&y,&zx,&zy);//输如if (y<0 && zy>0 || y>0 && zy<0)//如果中间隔墙{l=1;r=n;last=2147483647;//last记录离门最近距离ok=true;while (l<=r){mid=(int)(l+r)/2;if (zx>a[mid] && x<a[mid] || zx<a[mid] && x>a[mid])//如果门在中心{l=mid;last=0;break;//退出}if (min(abs(a[mid]-x),abs(a[mid]-zx))*2<last)//如果找到更近的距离{last=min(abs(a[mid]-x),abs(a[mid]-zx))*2;//记录if (a[mid]<x) l=mid;else r=mid;}elseif (a[mid]<x) l=mid+1;else r=mid-1;}printf("%d\n",last+abs(x-zx)+abs(zy-y));//输出}else printf("%d\n",abs(zx-x)+abs(zy-y));//输出}
}

题目2:教主泡嫦娥(jozj1793)

有一个环形山地,有n个落脚点,可以从任意落脚点任意状态出发。每个落脚点的代价为

当教主从第i个落脚点,走到第j个落脚点的时候(i和j相邻)
j的海拔高于i的海拔:如果教主处于上升状态,教主需要耗费两段高度差的绝对值的体力;否则耗费高度差平方的体力。
j的海拔低于i的海拔:如果教主处于下降状态,教主需要耗费两段高度差的绝对值的体力;否则耗费高度差平方的体力。

求走一圈的最小代价

输入输出(建议无视)

Input

输入的第一行为两个正整数N与M,即落脚点的个数与切换状态所消耗的体力。
接下来一行包含空格隔开的N个正整数,表示了每个落脚点的高度,题目保证了相邻落脚点高度不相同。

Output

输出仅包含一个正整数,即教主走一圈所需消耗的最小体力值。
注意:C++选手建议使用cout输出long long类型整数。

Sample Input

6 7
4 2 6 2 5 6

Sample Output

27

解题思路

如果枚举落脚点肯定会超时,所以我们就不能这么做。
用f[i][j][k]表示在第i个落脚点,状态为j,在当前有没有改变状态。
然后O(n)的时间复杂度轻易过
动态转移方程:
f[i][j][0]=f[i-1][j][0]+abs(a[i]-a[i-1]) 直接走过
f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+abs(a[i]-a[i-1]) 改变状态

f[i][j][0]=f[i-1][j][0]+pows(a[i]-a[i-1])
f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+pows(a[i]-a[i-1])
在这题被逼疯,默默AC不想说话

代码

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
long long f[10001][2][2],ans;
int a[10001],n,m;
long long abs(long long x)
{if (x<0) return 0-x;else return x;
}
long long pows(long long x)
{return x*x;}
void dp()
{f[0][1][1]=f[0][0][1]=1e16-1;for (int i=1;i<=n;i++)for (int j=0;j<2;j++)if ((a[i]<a[i-1])^j){f[i][j][0]=f[i-1][j][0]+abs(a[i]-a[i-1]);f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+abs(a[i]-a[i-1]);}else{f[i][j][0]=f[i-1][j][0]+pows(a[i]-a[i-1]);f[i][j][1]=min(f[i-1][j][1],min(f[i-1][j^1][0],f[i-1][j^1][1])+m)+pows(a[i]-a[i-1]);}//动态转移
}
int main()
{scanf("%d%d",&n,&m);for (int i=0;i<n;i++){scanf("%d",&a[i]);}a[n]=a[0];memset(f,0ll,sizeof(f));dp();//dp一次ans=min(min(f[n][0][0],f[n][0][1]),min(f[n][1][0],f[n][1][1]));//取最小情况memset(f,0ll,sizeof(f));f[0][0][0]=1e16-1;//从f[0][1][0]推过去dp();//dp一次ans=min(ans,f[n][1][1]-m);//取值memset(f,0ll,sizeof(f));f[0][1][0]=1e16-1;//从f[0][0][0]推过去dp();//dp一次ans=min(ans,f[n][0][1]-m);//取值cout<<ans<<endl;
}

题目3:保镖排队(jzoj1794)

有n个保镖,除第一个保镖外每个保镖都有一个上司,每个上司的下属都有在上司心目中的武力值。排队要求:

①互为上司-下属的两个保镖,上司在前,下属在后
②对于一个保镖的所有下属,武功实力较强的在前,较弱的在后。

求排队方案数

输入输出(建议无视)

Input

输入的第一行为一个正整数T,表示了数据组数。
对于每组数据:
第一行为一个正整数N。
接下来N行,每行描述一个保镖。
第i+1行,会有一个整数K,代表第i个保镖的下属个数,接下来K个数,代表第i个保镖的下属按照武功实力从高到低的编号。

Output

输出包括C行,每行对于每组数据输出方案数mod 10007后的结果。

Sample Input

2
5
2 2 3
2 4 5
0
0
0
7
2 2 3
2 4 5
2 6 7
0
0
0
0

Sample Output

3
10

解题思路

首先想到的是树形dp,由于保镖一没有上司所以一定是根。然后就是插空问题了,将3个保镖插入到3个空中,用组合的方法求插空方案数。用杨辉三角求组合。然后树形dp

代码

#include<cstdio>
#include<cstring>
using namespace std;
struct line{int y,next;
}a[10001];//邻接表
int f[1001],s,ls[1001],n,k,t,w,head,num[1001];
int cost[1002][1002];
void dp(int x)
{int q=ls[x];f[x]=1;if (q==0){num[x]=1;return;//没有子树}while (q!=0){dp(a[q].y);num[x]+=num[a[q].y];//累计f[x]=((f[x]*f[a[q].y])%10007)*(cost[num[x]-1][num[a[q].y]-1])%10007;//求方案数q=a[q].next;}num[x]++;//算上自己
}
int main()
{cost[0][0]=1;for (int i=1;i<=1001;i++)for (int j=1;j<=i;j++){cost[i][0]=1;cost[i][j]=(cost[i-1][j]+cost[i-1][j-1])%10007;}//杨辉三角scanf("%d",&t);for (int ti=1;ti<=t;ti++){w=0;s=0;memset(ls,0,sizeof(ls));memset(f,0,sizeof(f));memset(num,0,sizeof(num));//初始化scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&k);for(int j=1;j<=k;j++){scanf("%d",&a[++w].y);a[w].next=ls[i];ls[i]=w;}}dp(1);//dpprintf("%d\n",f[1]);}
}

题目4:教主的别墅(jzoj1795)

有N个人,有男有女,分成m段连续的部分,求分割的最小和最大字典序。

输入输出(建议无视)

Input

  输入的第1行为两个正整数N与M,用空格分隔。
  第2行包含一个长度为N的串,仅由字符组成,第i 个字符为0表示在这个位置上的LHXee为女生,若为1则为男生。

Output

  输出文件包含两行,每行M个正整数,正整数之间用空格隔开,行末无多余空格。这M个正整数从左到右描述了你所分的每个组的人数。
  第1行为字典序最小的方案,第2行为字典序最大的方案。

Sample Input

8 3
11001100

Sample Output

1 2 5
5 2 1

解题思路

这道题贪心竟然能过???

深搜TLE,贪心只能过样例

听某dalao讲用前缀和到第i个房间的男女差值(绝对值),然后每个房间最大差值为:

summsumm

然后正推一次反推一次。

#include<cstdio>
#include<iostream>
using namespace std;
int n,m,sum[5000002],ans,anss,t,last,w,a[100002];
char c;
int abs(int x)
{if (x<0) return 0-x;else return x;
}//绝对值
int main()
{scanf("%d%d\n",&n,&m);for (int i=1;i<=n;i++){cin>>c;if (c=='0') sum[i]-=1;else sum[i]+=1;sum[i]+=sum[i-1];}ans=abs(sum[n])/m;//求最大差值if (abs(sum[n])%m!=0) ans++;//向上取整if (sum[n]==0){int l=0;for (int i=1;i<=n;i++)if (sum[i]==0) l++;if (l>=m) ans=0;else ans=1;//能否做到没有差值}t=m;last=0;for (int i=1;i<=n;i++){anss=abs(sum[n]-sum[i])/(t-1);if (abs(sum[n]-sum[i])%(t-1)!=0) anss++;if (abs(sum[i]-sum[last])<=ans && anss<=ans){printf("%d ",i-last);last=i;t--;if (t==1) break;}}//查找printf("%d\n",n-last);ans=abs(sum[n])/m;if (abs(sum[n])%m!=0) ans++;if (sum[n]==0){int l=0;for (int i=1;i<=n;i++)if (sum[i]==0) l++;if (l>=m) ans=0;else ans=1;}t=m;last=n;w=0;for (int i=n-1;i>=1;i--){anss=abs(sum[i])/(t-1);if (abs(sum[i])%(t-1)!=0) anss++;if (abs(sum[last]-sum[i])<=ans && anss<=ans){a[++w]=last-i;last=i;t--;if (t==1) break;}}//倒着查找a[++w]=last;//记录for (int i=w;i>=1;i--) printf("%d ",a[i]);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324781.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

刘奕佳: 我的职校新生活 | 班级日常分享

点击上方蓝色关注我们&#xff01;时光匆匆&#xff0c;一转眼到了开学季&#xff0c;校园里弥漫着浓重的书香之气踏入校园&#xff0c;映入眼帘的就是雄伟的教学楼&#xff0c;意气风发的朗朗书声&#xff0c;让人情不自禁的陷入深深的学习中。实训楼当熟悉的上下课铃声又在我…

一个非常好的依存句法可视化工具

转载自 一个非常好的依存句法可视化工具 一个非常好的依存句法可视化工具 在依存句法研究中&#xff0c;常见的CONLL格式的句法树库&#xff0c;一眼看上去就不是太明白整棵树的结构。 这里分享推荐一个南京大学nlp实验室制作的一个依存句法可视化工具&#xff0c;效果如图…

DDD理论学习系列(8)-- 应用服务amp;amp;领域服务

1. 引言 单从字面理解&#xff0c;不管是领域服务还是应用服务&#xff0c;都是服务。而什么是服务&#xff1f;从SOA到微服务&#xff0c;它们所描述的服务都是一个宽泛的概念&#xff0c;我们可以理解为服务是行为的抽象。从前缀来看&#xff0c;根据DDD的经典分层架构&…

纪念中学15-5(=10)天感想

来自水lao ten days の 感想 前言 时光飞逝&#xff0c;转眼间&#xff0c;纪念中学的10天生活就那么过去了。回想起刚来&#xff0c;仿佛就在昨天。今天我将要离开这里&#xff0c;总感觉有无限的遗憾&#xff0c;无限的失落。可是花朵总是要谢&#xff0c;时光不停流逝。我…

祝张远远和杨凯博同学生日快乐 | 班级日常分享

点击上方蓝色关注我们&#xff01;首先祝张远远和杨凯博同学生日快乐&#xff01;上午丁老师和我说&#xff0c;今天是张远远同学的生日&#xff0c;于是我们就简单的商量了下&#xff0c;准备弄个活动&#xff0c;祝一下张远远同学生日快乐&#xff01;待下午时&#xff0c;获…

开放对静态资源的访问

前端控制器先进行处理&#xff0c;处理不了的交给default… 缺一不可

通俗理解维特比算法

转载自 通俗理解维特比算法 本文假定读者有一定的隐马模型基础&#xff01;或者大家可以参考这两篇文章。 隐马尔科夫模型-基本模型与三个基本问题和隐马尔科夫模型-前向算法 维特比算法说白了就是动态规划实现最短路径&#xff0c;只要知道“动态规划可以降低复杂度”这一…

使用docker-compose搭建AspNetCore开发环境

1 使用docker-compose搭建开发环境 我们的目标很简单&#xff1a;使用docker-compose把若干个docker容器组合起来就成了。 首先使用Nginx代理所有的Web程序&#xff0c;这样只需要在主机上监听一个端口就可以了&#xff0c;不污染主机。再组合各Web程序、Redis/Memcached、Sq…

珍惜、珍爱!

点击上方蓝色关注我们&#xff01;这是一篇付费文章&#xff0c;其实目的就是不让人看&#xff0c;哈哈哈&#xff01;不让别人看为什么还要写&#xff1f;因为写了才痛快&#xff01;

SpringAOP的SchemaBase方式

文章目录1、SpringAOP的专业概念:2、SpringAOP的SchemaBase方式基本流程SchemaBase方式环绕通知方式实现AOPSchemaBase方式的异常通知SpringAOP的SchemaBase方法的参数1、SpringAOP的专业概念: 真实对象: 要进行功能扩展的对象,相当于A对象 代理对象: 完成功能扩展的对象,相当于…

ssl2661-廉价最短路径【SPFA】

前言 这是一篇迟到的博客 题目 找一条最廉价的最短路径 输入输出&#xff08;建议无视&#xff09; Input 输入文件第一行有两个整数m和n&#xff0c;用一个空格隔开&#xff0c;其中&#xff0c;m是顶点数&#xff0c;而n是边数。接下来的n行给出所有的边及其价值&#…

自然语言处理的十个发展趋势

转载自 哈工大刘挺教授&#xff1a;自然语言处理的十个发展趋势 近日&#xff0c;由中国人工智能学会、阿里巴巴集团 & 蚂蚁金服主办&#xff0c;CSDN、中国科学院自动化研究所承办的第三届中国人工智能大会&#xff08;CCAI 2017&#xff09;在杭州国际会议中心盛大开幕…

SpringAOP的Aspectj方式*

SpringAOP的Aspectj介绍 问题: 目前我们已经能够使用SpringAOP的SchemaBased方式来实现功能扩展。在使用SchemaBased方式实现功能扩展时&#xff0c;发现一个扩展代码就需要声明对应的实现了指定的接口的类&#xff0c;这样造成代码的结构体系过于繁杂。一个通知一个类。 解决…

拥抱.NET Core系列:依赖注入(1)

前言 DIP、IoC、DI 说起DI不得不提IoC这个模式&#xff0c;很多人会把DI和IoC混为一谈&#xff0c;但其实这两者是概念和实现的关系。 依赖倒置原则&#xff08;DIP&#xff09;&#xff1a;软件设计原则&#xff0c;要依赖于抽象&#xff0c;不要依赖具体实现。 控制反转&…

来自学长同学分享的学习方法

点击上方蓝色关注我们&#xff01;本文原创&#xff1a;陈浴森同学在科技高度发展的今天&#xff0c;计算机在生活中的作用越来越突出。在学校这一年多的学习当中&#xff0c;我总结了不少的经验&#xff0c;让我在以后的学习当中受益匪浅。一开始没学编程的时候&#xff0c;看…

训练集样本不平衡问题对CNN的影响

转载自 训练集样本不平衡问题对CNN的影响 训练集样本不平衡问题对CNN的影响 本文首发于知乎专栏“ai insight”&#xff01; 卷积神经网络&#xff08;CNN&#xff09;可以说是目前处理图像最有力的工具了。 而在机器学习分类问题中&#xff0c;样本不平衡又是一个经常遇到…

银行转账案例

[1] 案例需求 用户访问登录页面&#xff0c;在页面中输入用户名和密码点击登录&#xff0c;登录成功后 进入到主页中。如果登录败&#xff0c;则在登录页面中提示用户用户名或密码错误。在主页面中&#xff0c;用户在填写银行转账信息&#xff0c;包括:转账账户&#xff0c;转账…

20级、19级 | 一天一瞬间!【日更】

点击上方蓝色关注我们&#xff01;欢迎来到今天的一天一瞬间专栏今天是2020年09月08日&#xff0c;天气状况&#xff1a;炎热。19级目前还是上午上课下午补课&#xff0c;补课私下里和我说&#xff0c;班内学生表现都不错&#xff0c;听罢&#xff0c;甚是开心&#xff0c;不管…

一张图看懂小程序全生态

6月9日小程序发布整半年&#xff0c;这半年里&#xff0c;小程序接连经历了&#xff1a;受追捧——遇冷——质疑——趋于理性的过程。我们对小程序这半年来的产业发展做了全面的梳理&#xff0c;从中可以发现&#xff0c;小程序已俨然形成了自己的生态体系&#xff0c;这一生态…

自然语言处理中的Attention Model:是什么以及为什么[一]

转载自 自然语言处理中的Attention Model&#xff1a;是什么以及为什么[一] 自然语言处理中的Attention Model&#xff1a;是什么以及为什么[一] 1、前言 要是关注深度学习在自然语言处理方面的研究进展&#xff0c;我相信你一定听说过Attention Model&#xff08;后文有时…