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

本人开始学习信息学大概以来,主要都是用的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==) return x/k;
return x/k+;
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=m;i++){
scanf("%d%d",&x,&y);
a[x]++;
a[y]--;
}
for(int i=;i<=n+;i++){
tmp+=a[i];
ans=max(ans,need(tmp));
}
ans=min(ans,need(m));
printf("%d",ans);
return ;
}

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

设 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][],x,a[M],b[M],ans;
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=;i<=n;i++){
scanf("%d",&b[i]);
}
f[][][]=a[];
f[][][]=b[];
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
f[i][j][]=f[i-][j][];
f[i][j][]=f[i-][j][];
if(j>) f[i][j][]=max(f[i-][j-][],f[i][j][]);
if(j>) f[i][j][]=max(f[i-][j-][],f[i][j][]);
f[i][j][]+=a[i];
f[i][j][]+=b[i];
}
}
for(int i=;i<=m;i++){
ans=max(ans,max(f[n][i][],f[n][i][]));
}
printf("%d",ans);
return ;
}

然后是第三题

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

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

首先对于一个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[],p[];
bool f[];
LL cnt(LL x){
LL co=;
for(LL i=x+;i<=n;i++){
if(p[i]<p[x]) co++;
}
return co;
}
LL check(LL x){
LL co=;
for(LL i=;i<=n;i++){
if(f[i]) continue;
co++;
if(co==x){
f[i]=true;
return i;
}
}
return -;//这句话毫无意义
}
int main(){
s[]=;
scanf("%lld%lld",&n,&m);
memset(f,true,sizeof(f));
for(LL i=;i<=n;i++) s[i]=s[i-]*i;
for(LL i=;i<=n;i++) scanf("%lld",&p[i]),f[i]=false;
for(LL i=;i<=n;i++){
m+=cnt(i)*s[n-i];
}
for(LL i=;i<=n;i++){
if(i>) printf(" ");
printf("%lld",check(m/s[n-i]+));
m%=s[n-i];
}
return ;
}

第四道题,是一个特殊的二叉树,数字由于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>=''&&x<='') return true;
return false;
}
int take(char x){
if(isd(x)) return x-'';
if(x=='+') return -;
if(x=='-') return -;
if(x=='*') return -;
return -;
}
bool search(LL x){
if(p[x]>=){
cnt++;
if(p[x]==c[cnt]) return true;
return false;
}
if(l[x]==||r[x]==) 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==) return ;
return x*pow(x,y-);
}
LL calc(LL x){
if(p[x]>=) return p[x];
if(p[x]==-) return calc(l[x])+calc(r[x]);
if(p[x]==-) return calc(l[x])-calc(r[x]);
if(p[x]==-) return calc(l[x])*calc(r[x]);
return pow(calc(l[x]),calc(r[x]));
}
void dfs(LL x){
if(x==n+){
cnt=;
if(search()){
printf("%lld",calc());
exit();
}
return;
}
for(LL i=x-;i>;i--){
if(p[i]>=) continue;
if(l[i]==){
l[i]=x,f[x]=i;
dfs(x+);
l[i]=,f[x]=;
}
else if(r[i]==){
r[i]=x,f[x]=i;
dfs(x+);
r[i]=,f[x]=;
}
}
}
int main(){
scanf("%lld",&n);
cin>>a;
cin>>b;
f[]=;
f[]=;
for(LL i=;i<=n;i++){
p[i]=take(a[i-]);
c[i]=take(b[i-]);
}
dfs();
return ;
}

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

HDnoip2017题解的更多相关文章

  1. [HDNOIP2017提高组]题解

    (送给外省的同学们:HD = 海淀) [HDNOIP201701]小鱼干 试题描述 小喵喵有 n 个小鱼干排成一列,其中第 i 个小鱼干有两种属性,美味度 ai 和特殊度 bi. 现在小喵喵要吃掉一些 ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. jdbc学习总结

    jdbc学习总结:   一.简介: jdbc,直译为java连接数据库.实际为java为很好的操作数据库而提供的一套接口,接口的实现(即驱动)由各个数据库厂商提供.   二.知识要点: 连接5要素,3 ...

  2. C# 如何添加Word文本和图片超链接

    超链接简单来讲就是内容链接,通过设置超链接可以实现对象与网页.站点之间的连接.链接目标可以是网页.图片.邮件地址.文件夹或者是应用程序.设置链接的对象可以是文本或者图片. 在以下内容中,我将介绍如何用 ...

  3. js系列教程1-数组操作全解

    全栈工程师开发手册 (作者:栾鹏) 快捷链接: js系列教程1-数组操作全解 js系列教程2-对象和属性全解 js系列教程3-字符串和正则全解 js系列教程4-函数与参数全解 js系列教程5-容器和算 ...

  4. DevOps之存储和数据库

    唠叨话 关于德语噢屁事的知识点,仅提供专业性的精华汇总,具体知识点细节,参考教程网址,如需帮助,请留言. <数据(Data)> 了解有关数据部分.涉及存储及数据库的概念:知识与技能的层次( ...

  5. Android 设备兼容性(1)

    引用: Android官网 > 开发 > API 指南 > Introduction > Device Compatibility 1. 基本概念 Android被设计成能在各 ...

  6. Android的快速开发框架 afinal

    afinal 框架学习: http://www.oschina.net/p/afinal

  7. 文本可视化[二]——《今生今世》人物关系可视化python实现

    文本可视化[二]--<今生今世>人物关系可视化python实现 在文本可视化[一]--<今生今世>词云生成与小说分析一文中,我使用了jieba分词和wordcloud实现了,文 ...

  8. Tomcat 笔记-设置虚拟主机

    通过作用虚拟主机,可以使多个不同域名的网站共存于一个Tomcat中 在tomcat的server.xml文件中添加主机名: <Host name="hostname" app ...

  9. zookeeper 笔记-机制的特点

    zookeeper的getData(),getChildren()和exists()方法都可以注册watcher监听.而监听有以下几个特性: 一次性触发(one-time trigger) 当数据改变 ...

  10. Mybatis Mapper.xml 需要查询返回List<String>

    当需要查询返回 List<String> <select id="getByIds" parameterType="java.lang.String&q ...