在线单页网站制作,杭州市建设工程招标平台,大型网站建设 教程,wordpress模板修改插件那么#xff0c;作为一名初入信息竞赛的选手#xff0c;我也试着开始用博客记录自己的学习历程#xff0c;那么这篇文章先简单介绍一下我自己吧。 本人开始学习信息学大概以来#xff0c;主要都是用的C#xff0c;所以对其他语言并不是十分熟悉。2016我还只是一名NOIP普及…那么作为一名初入信息竞赛的选手我也试着开始用博客记录自己的学习历程那么这篇文章先简单介绍一下我自己吧。 本人开始学习信息学大概以来主要都是用的C所以对其他语言并不是十分熟悉。2016我还只是一名NOIP普及组的选手水掉一个一等奖后美滋滋继续往下学。最近刚刚搞完今年HDNIOIP提高组前听同学说最后一道题是省选第二题的难度后我懵逼了由于最近刚比完如果想要题解可以搜索“xjr01” hdNOIP2017 题解 - http://www.cnblogs.com/xiao-ju-ruo-xjr/ 其实第一篇文章也不知道写什么,那就胡乱写一下普及组的题解吧无聊。 那么首先来看第一题 无脑暴力哈希前缀和什么的随便写就不解释了。 #includealgorithm
#includeiostream
#includecstring
#includecstdio
#includecmath
#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%k0) return x/k;return x/k1;
}
int main(){scanf(%d%d%d,n,m,k);for(int i1;im;i){scanf(%d%d,x,y);a[x];a[y]--;}for(int i1;in1;i){tmpa[i];ansmax(ans,need(tmp));}ansmin(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 ]转移 至于为什么你们自己想 #includealgorithm
#includeiostream
#includecstring
#includecstdio
#includecmath
#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 i1;in;i){scanf(%d,a[i]);}for(int i1;in;i){scanf(%d,b[i]);}f[1][0][0]a[1];f[1][0][1]b[1];for(int i2;in;i){for(int j0;jm;j){f[i][j][0]f[i-1][j][0];f[i][j][1]f[i-1][j][1];if(j1) f[i][j][1]max(f[i-1][j-2][0],f[i][j][1]);if(j0) 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 i0;im;i){ansmax(ans,max(f[n][i][0],f[n][i][1]));}printf(%d,ans);return 0;
} 然后是第三题 第三题大概是比较复杂的一道题了关键就在于如何处理全排列的序号。这道题一共分为两部分 第一部分将给定的全排列转化成全排列的序号。 首先对于一个k他的全排列一共有k!k的阶乘种排列。 设置一个变量 cnt0s[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小的数即可 所以说我们只需要一个阶乘的预处理然后瞎搞就好了。 #includealgorithm
#includeiostream
#includecstring
#includecstdio
#includecmath
#define LL long long
#define M
using namespace std;
LL n,m,s[22],p[22];
bool f[22];
LL cnt(LL x){LL co0;for(LL ix1;in;i){if(p[i]p[x]) co;}return co;
}
LL check(LL x){LL co0;for(LL i1;in;i){if(f[i]) continue;co;if(cox){f[i]true;return i;}}return -1;//这句话毫无意义
}
int main(){s[0]1;scanf(%lld%lld,n,m);memset(f,true,sizeof(f));for(LL i1;in;i) s[i]s[i-1]*i;for(LL i1;in;i) scanf(%lld,p[i]),f[i]false;for(LL i1;in;i){mcnt(i)*s[n-i];}for(LL i1;in;i){if(i1) printf( );printf(%lld,check(m/s[n-i]1));m%s[n-i];}return 0;
} 第四道题是一个特殊的二叉树数字由于n10,我就只写了一个比较好些的但是比较慢的程序。 这个程序大概是这样由于在先序遍历中子节点一定在父节点后才出现每一个节点的右子节点如果有的话总在它父节点的左子节点后出现所以我只是暴力建树枚举每个点的父节点建完树之后用中序遍历检验建的这棵树是否正确即可如果即可再直接递归的计算。 然而万万没想到我最后还是栽了一个点应为这道题有^的操作这里的^是指次方而不是异或,我这里就暂时不写高精度了。 #includealgorithm
#includeiostream
#includecstring
#includecstdio
#includecmath
#includestack
#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(x0x9) 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(y0) 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(xn1){cnt0;if(search(1)){printf(%lld,calc(1));exit(0);}return;}for(LL ix-1;i0;i--){if(p[i]0) continue;if(l[i]0){l[i]x,f[x]i;dfs(x1);l[i]0,f[x]0;}else if(r[i]0){r[i]x,f[x]i;dfs(x1);r[i]0,f[x]0;}}
}
int main(){scanf(%lld,n);cina;cinb;f[1]1;f[2]1;for(LL i1;in;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