HDnoip2017题解

那么,作为一名初入信息竞赛的选手,我也试着开始用博客记录自己的学习历程,那么这篇文章先简单介绍一下我自己吧。

本人开始学习信息学大概以来,主要都是用的C++,所以对其他语言并不是十分熟悉。2016我还只是一名NOIP普及组的选手,水掉一个一等奖后美滋滋继续往下学。最近刚刚搞完今年HDNIOIP提高组前,听同学说最后一道题是省选第二题的难度后我懵逼了(由于最近刚比完如果想要题解可以搜索“xjr01”, hdNOIP2017 题解 -> " http://www.cnblogs.com/xiao-ju-ruo-xjr/ "),其实第一篇文章也不知道写什么,那就胡乱写一下普及组的题解吧(无聊)。

那么首先来看第一题

无脑暴力,哈希前缀和什么的随便写,就不解释了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 2020
using namespace std;
int n,m,k,a[M],ans,x,y,tmp;
int need(int x){if(x%k==0) return x/k;return x/k+1;
}
int main(){scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);a[x]++;a[y]--;}for(int i=1;i<=n+1;i++){tmp+=a[i];ans=max(ans,need(tmp));}ans=min(ans,need(m));printf("%d",ans);return 0;
}

第二题,一个简单的动态规划

设 f [ i ][ j ][ 0 ]表示时刻 i 时耗费了 j 的体力来到a树,f [ i ][ j ][ 1 ]表示时刻 i 时耗费了 j 的体力来到b树。

转移:

f [ i ][ j ][ 1 ]可以从 f [ i-1 ][  j-2 ][ 0 ]和 f [ i-1 ][ j ][ 1 ]转移

f [ i ][ j ][ 0 ]可以从 f [ i-1 ][  j-1 ][ 1 ]和 f [ i-1 ][ j ][ 0 ]转移

(至于为什么你们自己想)

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M 300
using namespace std;
int n,m,f[M][M][2],x,a[M],b[M],ans;
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}for(int i=1;i<=n;i++){scanf("%d",&b[i]);}f[1][0][0]=a[1];f[1][0][1]=b[1];for(int i=2;i<=n;i++){for(int j=0;j<=m;j++){f[i][j][0]=f[i-1][j][0];f[i][j][1]=f[i-1][j][1];if(j>1) f[i][j][1]=max(f[i-1][j-2][0],f[i][j][1]);if(j>0) f[i][j][0]=max(f[i-1][j-1][1],f[i][j][0]);f[i][j][0]+=a[i];f[i][j][1]+=b[i];}}for(int i=0;i<=m;i++){ans=max(ans,max(f[n][i][0],f[n][i][1]));}printf("%d",ans);return 0;
}

然后是第三题

第三题大概是比较复杂的一道题了,关键就在于如何处理全排列的序号。
这道题一共分为两部分

第一部分,将给定的全排列转化成全排列的序号。

首先对于一个k,他的全排列一共有k!(k的阶乘)种排列。

设置一个变量 cnt=0,s[n]存储这个排列;

对于第 i 位,若有 k 个 j 满足: i < j <= n 且 s[ j ] > s[ i ],则我们需要将 cnt 加上 ( n - i )!* k。

为什么呢?对于某一个长为 N 的排列 , 一共分为 N 个部分,第 i 个部分是以 第 i 小的数为开头的排列,且这N个部分都有(N-1)!个排列。

也就是说,我们对于每一位,从这一位到结尾都看做一个未离散化的排列(依靠每一个数的大小关系把他们看做一个不是很严谨的排列) ,然后求这个排列在这些数“全排列”中的哪个部分,也就求得了需要从0向后跳个部分才能达到当前的部分。

这样我们就求得了给出序列的序号(编号)

我们将m加上cnt,得到k,就得到了最后应该输出的排列的编号。

第二部分,输出给定编号的全排列。

读到这里,你应该已经明白了,对于第 i 位,我们只要用 k 除以(n-i)的阶乘,就知道这个序列应该是位于第m个部分,然后输出在剩余的未输出过的数中第m小的数即可

所以说,我们只需要一个阶乘的预处理,然后瞎搞就好了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define M
using namespace std;
LL n,m,s[22],p[22];
bool f[22];
LL cnt(LL x){LL co=0;for(LL i=x+1;i<=n;i++){if(p[i]<p[x]) co++;}return co;
}
LL check(LL x){LL co=0;for(LL i=1;i<=n;i++){if(f[i]) continue;co++;if(co==x){f[i]=true;return i;}}return -1;//这句话毫无意义
}
int main(){s[0]=1;scanf("%lld%lld",&n,&m);memset(f,true,sizeof(f));for(LL i=1;i<=n;i++) s[i]=s[i-1]*i;for(LL i=1;i<=n;i++) scanf("%lld",&p[i]),f[i]=false;for(LL i=1;i<=n;i++){m+=cnt(i)*s[n-i];}for(LL i=1;i<=n;i++){if(i>1) printf(" ");printf("%lld",check(m/s[n-i]+1));m%=s[n-i];}return 0;
}

第四道题,是一个特殊的二叉树,数字由于n<=10,我就只写了一个比较好些的但是比较慢的程序。

这个程序大概是这样,由于在先序遍历中,子节点一定在父节点后才出现,每一个节点的右子节点(如果有的话)总在它父节点的左子节点后出现,所以我只是暴力建树,枚举每个点的父节点,建完树之后用中序遍历检验建的这棵树是否正确即可,如果即可,再直接递归的计算。

然而,万万没想到,我最后还是栽了一个点应为这道题有^的操作(这里的^是指次方,而不是异或),我这里就暂时不写高精度了。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<stack>
#define LL long long
#define M 20
using namespace std;
LL n,m,p[M],f[M],l[M],r[M],c[M],cnt;
string a,b;bool isd(char x){if(x>='0'&&x<='9') return true;return false;
}
int take(char x){if(isd(x)) return x-'0';if(x=='+') return -1;if(x=='-') return -2;if(x=='*') return -3;return -4;
}
bool search(LL x){if(p[x]>=0){cnt++;if(p[x]==c[cnt]) return true;return false;}if(l[x]==0||r[x]==0) return false;if(!search(l[x])) return false;cnt++;if(p[x]!=c[cnt]) return false;if(!search(r[x])) return false;return true; 
}
LL pow(LL x,LL y){if(y==0) return 1;return x*pow(x,y-1);
}
LL calc(LL x){if(p[x]>=0) return p[x];if(p[x]==-1) return calc(l[x])+calc(r[x]);if(p[x]==-2) return calc(l[x])-calc(r[x]);if(p[x]==-3) return calc(l[x])*calc(r[x]);return pow(calc(l[x]),calc(r[x])); 
} 
void dfs(LL x){if(x==n+1){cnt=0;if(search(1)){printf("%lld",calc(1));exit(0);}return;}for(LL i=x-1;i>0;i--){if(p[i]>=0) continue;if(l[i]==0){l[i]=x,f[x]=i;dfs(x+1);l[i]=0,f[x]=0;}else if(r[i]==0){r[i]=x,f[x]=i;dfs(x+1);r[i]=0,f[x]=0;}}
}
int main(){scanf("%lld",&n);cin>>a;cin>>b;f[1]=1;f[2]=1;for(LL i=1;i<=n;i++){p[i]=take(a[i-1]);c[i]=take(b[i-1]);}dfs(2);return 0;
}

至于提高组的题解,欢迎大家访问http://www.cnblogs.com/xiao-ju-ruo-xjr/ 

转载于:https://www.cnblogs.com/OYJason/p/7608106.html

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

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

相关文章

_Linux结束进程到底有多少种方法?

请关注本头条号&#xff0c;每天坚持更新原创干货技术文章。如需学习视频&#xff0c;请在微信搜索公众号“智传网优”直接开始自助视频学习。1. 前言我们经常在Linux里使用kill命令来结束某后台进程。但kill命令实际上是向进程发送信号&#xff0c;并且有多种信号。终止运行一…

svg mysql_SVG 实例

SVG 实例简单的 SVG 实例一个简单的SVG图形例子&#xff1a;这里是SVG文件(SVG文件的保存与SVG扩展)&#xff1a;/p>"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">stroke-width"2" fill"red" />SVG 代码解析&#xff1a;第一行…

Failed to import pydot

在使用keras进行模型绘制的时候&#xff0c;出现了一个错误 Failed to import pydot. You must install pydot and graphviz for pydotprint to work. 下面是解决方案&#xff0c;使用命令sudo apt-get install graphviz&#xff0c;将graphviz安装在系统环境下&#xff0c;不要…

mulitpartfile怎么接收不到值_光端机电源正常,但是运行不了怎么办?

光端机&#xff0c;是光信号传输的终端设备&#xff0c;在安防领域有很好的应用。伴随着监控的发展&#xff0c;视频光端机就是把1路到多路的模拟视频信号通过各种编码转换成光信号通过光纤介质来传输的设备分&#xff0c;分为模拟光端机和数字光端机。其中&#xff0c;光传输系…

java as操作_java 对类型的基本操作小结

1.json 字符串转换成对象SyncCarriageStatusDTO dto JSON.parseObject(value,SyncCarriageStatusDTO.class);List pparams JSON.parseObject(dto.getData(),new TypeReference>() {});2.对象转换成字符串对象String data JSON.toJSONString(pkg);2.枚举字符串转换成枚举类…

aes 加密_结合RSA与AES实现前后端加密通信

结合RSA与AES实现前后端加密通信一、思路使用RSA秘钥生成工具生成一对公钥(A)和私钥(B)&#xff0c;前端保留A&#xff0c;后端保留B。前端发送数据时&#xff0c;先生成一串随机16位字符串作为AES的秘钥(C)&#xff0c;然后使用A使用RSA算法对C进行加密&#xff0c;得到加密后…

cxf java调用.net_CXF在项目中的真实运用--WS访问客户端编写[java、.net]

一、首先,CXF的WS实现类由于实现了和Spring的无缝集成&#xff0c;因此可以采用Spring的单元测试来测试基本功能。代码如下&#xff1a;[java]package com.defshare.sy.test.biz;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import…

中值滤波去除图像噪声的matlab程序

中值滤波&#xff1a;基于排序理论的一种能有效抑制噪声的非线性信号处理技术。 方法&#xff1a;取含有基数&#xff08;偶数会有半像素的差&#xff09;个模板数据的滑动模板&#xff0c;对模板中的数据从小到大排序&#xff0c;取排在中间位置上的数据作为最终的处理结果。 …

android 音乐app 进度条_让这些可爱的APP成为你的生活好帮手

对于可爱美观的东西&#xff0c;绝大多数人都会喜欢&#xff0c;尤其是女孩子。今天给大家推荐一波可爱又实用的APP&#xff0c;让它们成为你的生活好助手。以下应用在手机应用商店搜索即可下载。01 喵喵记账 支持 iOS 和 Android&#xff0c;免费谈到记账&#xff0c;很多…

java中scanner与hashmap_Java中HashMap的使用练习

问题&#xff1a;给定任意一个字符串“today is a special day”&#xff0c;长度为任意&#xff0c;要求找出其出现次数最多的字符及计算次数。(可以用HashMap&#xff0c;HashSet&#xff0c;Collections实现)解决&#xff1a;利用HashMap和HashSet解决。代码&#xff1a;imp…

计蒜客NOIP2017提高组模拟赛(四)day1

T1:小X的质数 小 X 是一位热爱数学的男孩子&#xff0c;在茫茫的数字中&#xff0c;他对质数更有一种独特的情感。小 X 认为&#xff0c;质数是一切自然数起源的地方。 在小 X 的认知里&#xff0c;质数是除了本身和 1 以外&#xff0c;没有其他因数的数字。 但由于小 X 对质数…

c# combobox集合数据不显示_Excel也能玩转百万数据

最近一方君工作中要查询编辑很多的数据&#xff08;超过30万行&#xff0c;25个字段&#xff09;&#xff0c;这么多数据放在Excel表中当然是没办法操作的&#xff0c;筛选的时候很容易崩溃&#xff0c;原来用得很顺滑的一些公式&#xff0c;一计算就未响应&#xff0c;多点几下…

kcp-go源码解析

概念ARQ:自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层的错误纠正协议之一.RTO:Retransmission TimeOutFEC:Forward Error Correctionkcp简介kcp是一个基于udp实现快速、可靠、向前纠错的的协议&#xff0c;能以比TCP浪费10%-20%的带宽的代价&#xff0c;换…

scada系统集成_MES/MOM与WMS系统集成应用案例-系统接口、交互数据分析

写在面前(By 小智)前面我们介绍了西门子、罗克韦尔、施耐德、达索等的MES/MOM平台(见文末推荐)也绍和分析了MES与ERP之间的系统集成案例&#xff1a;MES与EPR进行系统集成的实际案例-系统接口、交互数据分析同时分享了各种系统之间集成的文章&#xff1a;Teamcenter、TIA Porta…

java环境变量设置详解_JAVA环境变量配置详解(Windows)

JAVA环境变量JAVA_HOME、CLASSPATH、PATH设置详解Windows下JAVA用到的环境变量主要有3个&#xff0c;JAVA_HOME、CLASSPATH、PATH。JAVA_HOME指向的是JDK的安装路径&#xff0c;如C:\jdk1.5.0_06&#xff0c;在这路径下你应该能够找到bin、lib等目录。( 今晚使用新系统配置&…

【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)

题目描述 在宽广的非洲荒漠中&#xff0c;生活着一群勤劳勇敢的羊驼家族。被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖&#xff0c;外人也称其为“所驼门王”。所驼门王毕生致力于维护家族的安定与和谐&#xff0c;他曾亲自率军粉碎河蟹帝国主义的野蛮侵略&#…

ftl 展示图片_视频号变迁的内容展示逻辑

最初的视频号只有单列展示&#xff0c;只有关注栏&#xff0c;并没有朋友和热门区分。产出内容限制为不超过 1 分钟的视频&#xff0c;或 9 张以内的图片。单列信息流、时间倒序排列(也存在个别特例)。这里想到之前龙哥说的关于朋友圈的思考&#xff1a;朋友圈是一个广场&#…

10.3 考试 (考得不好)

T1 我只能说 它是一个比较暴力的dp&#xff0c;需要人力讨论... 所以考试觉得讨论太麻烦&#xff0c;直接内心崩溃了....(好像这也是我考炸的原因吧) 教训&#xff1a;以后要勤快一些&#xff0c;代码能力 唉唉唉 #include <cstdio> #include <cstring> #include &…

java接口文件定义类_Java入门笔记(四)类、包和接口

一、类 classpublic class Person{String name;int age;Person(String name, int age){this.name name;this.age age;}void sayHello(){System.out.println("Hello!");}}1. 属性a. 字段也就是成员变量&#xff0c;在构造方法中进行初始化&#xff0c;没有指针的概念…

小程序[渲染层网络层错误] failed to load image_游戏中水的渲染技术

水的渲染一直是图形学需要解决的问题&#xff0c;本篇博客主要介绍用傅里叶变换算法实现的水反射&#xff0c;也是一种假反射效果&#xff0c;目的是优化效率。实现的效果如下图所示&#xff1a;使用傅里叶系数来表示地形高度的假反射效果&#xff0c;在我们开发的游戏中使用水…