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;
}
View Code

求先序排列

分析:将中序排列分为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;
}
View Code

装箱问题

分析:裸背包。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;
}
View Code

总结:水的不要不要的。

以上是关于NOIP2001普及组解题报告的主要内容,如果未能解决你的问题,请参考以下文章

NOIP2017普及组解题报告

NOIP1999普及组解题报告

NOIP2002普及组解题报告

NOIP2012普及组 (四年后的)解题报告 -SilverN

NOIP1998普及组解题报告

NOIP2016普及组复赛解题报告