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

本人开始学习信息学大概以来,主要都是用的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. Go语言备忘录:反射的原理与使用详解

    目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能   1.预备知识: Go的变量都是静态类 ...

  2. VLAN的三种类型及三种属性

  3. 【转】Python实现修改Windows CMD命令行输出颜色(完全解析)

    用Python写命令行程序的时候,单一的输出颜色太单调.其实我们可以加些色彩,比如用红色表示警告,绿色表示结果正常等.网上也有几篇类似的帖子,但是没有把问题讲清楚,贴的代码也不是太清晰.这里,对Win ...

  4. bootstrap 响应式导航条模板(含下拉菜单,弹出框)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. python concurrent.futures

    python因为其全局解释器锁GIL而无法通过线程实现真正的平行计算.这个论断我们不展开,但是有个概念我们要说明,IO密集型 vs. 计算密集型. IO密集型:读取文件,读取网络套接字频繁. 计算密集 ...

  6. ActiveMQ——activemq的安装详情,修改密码

    1.安装 下载 http://activemq.apache.org/download-archives.html, [推荐]ActiveMQ 5.13.4 Release与jdk1.7搭配(其它版本 ...

  7. Windows 10 快捷键汇总表格

    Windows 10 快捷键汇总表格 Windows 10 快捷键汇总 Win键 + Tab 激活任务视图 Win键 + A 激活操作中心 Win键 + C 通过语音激活Cortana Win键 + ...

  8. VIM格式化代码(How to format code with VIM)

    1) 按两下小写g,即gg,定位光标到第一行.(2) 按住Shift+v,即大写V,进入可视化编辑的列编辑模式.(3) Shift+g,即大写G,选中整个代码.(4) 按下等号=,格式化所有代码.

  9. eclipse远程调试Linux环境下的web项目

    前提: 远程服务器上的代码和本地的代码同步 第一步 : 配置远程服务器下的startup.sh文件 在第一行添加 : declare -x CATALINA_OPTS="-server -X ...

  10. .5-Vue源码之AST(1)

    讲完了数据劫持原理和一堆初始化 现在是DOM相关的代码了 上一节是从这个函数开始的: // Line-3924 Vue.prototype._init = function(options) { // ...