NOIP2001普及组解题报告
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2001普及组解题报告相关的知识,希望对你有一定的参考价值。
数的计算
分析:递归即可。不用学他造数。
#include<iostream> #include<algorithm> using namespace std; int f(int n){ int ret=1; for(int i=1;i<=n/2;++i){ ret+=f(i); } return ret; } int main(){ int n; cin>>n; cout<<f(n); return 0; }
求先序排列
分析:将中序排列分为l到r,后序找l到r子树的根,再递归往下算即可。
#include<iostream> #include<algorithm> #include<cstring> using namespace std; const int maxn=15; char a[maxn],b[maxn]; int len; void dfs(int l,int r){ if(l>r)return ; for(int i=len-1;i>=0;--i){ for(int j=l;j<=r;++j){ if(b[i]==a[j]){ cout<<b[i]; dfs(l,j-1); dfs(j+1,r); return ; } } } } int main(){ cin>>a>>b; len=strlen(a); dfs(0,len-1); return 0; }
装箱问题
分析:裸背包。f[i]=max(f[i],f[i-a[j]]);
#include<iostream> #include<algorithm> using namespace std; const int maxn=40,maxm=20010; int a[maxn]; bool f[maxm]; int main(){ int v,n; cin>>v>>n; f[0]=1; for(int i=1;i<=n;++i)cin>>a[i]; for(int i=1;i<=n;++i){ for(int j=v;j>=a[i];--j){ if(f[j-a[i]]) f[j]=1; } } int ans=-1; for(int i=v;i>=0;--i){ if(f[i]){ ans=i; break; } } cout<<v-ans; return 0; }
总结:水的不要不要的。
以上是关于NOIP2001普及组解题报告的主要内容,如果未能解决你的问题,请参考以下文章