NOIP2012 普及组真题 4.13校模拟

考试状态:

我今天抽签看了洛谷的…

这我能怂???凶中带吉,我怕考试??我!不!怕!

看着整个机房的男同学们,我明白我是不会触发我的忌了。很好,开刷。

A. 【NOIP2012普及组真题】 质因数分解

 

麦芽的香气。行家啊!这题刷过的吧!!这个数据看起来是有点吓人,然而…

并没什么卵用。就是吓吓你。

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int main(){
//    freopen("prime.in","r",stdin);
//    freopen("prime.out","w",stdout);
    int n;
    cin>>n;
    for(int i=2;i<=n;i++){
        if(n%i==0){
                cout<<n/i;
                return 0;
        }
    }
}

仔细看题,看清楚了题目,这题就是个连printf都懒得用的水题…

好的下一个。

B. 【NOIP2012普及组真题】 寻宝

这种玩意…边看题边写…不断重构…不断修改…不断Debug

好吧,用搜索模拟一下其实就好了。

因为是边看边写,所以代码有点冗杂,有许多压根用不到的数据我也顺手存了下来。没事,反正一点点数据并不会爆炸。

#include<iostream>
#include<cstdio>
const int Mod=20123;
using namespace std;
struct BedRoom{
    bool Up;
    int Pointer;
    int Num;
    int Next;
}Building[10005][105];
int Ftot[10005];
int n,m,x,y,ans;
void dfs(int Floor,int Room){
    //cout<<"time check "<<Floor<<" "<<Room<<" "<<ans<<endl;
    if(Floor==n){
        //cout<<"End"<<endl;
        ans+=Building[Floor][Room].Pointer;
        ans%=Mod;
        return;
    }
    int Go=Building[Floor][Room].Pointer;
    //cout<<"Go "<<Go;
    ans+=Go;
    ans%=Mod;
    if(Building[Floor][Room].Up==true){
        Go--;
    }
    //Go%=Ftot[Floor];
    int Index=Room;
    for(int i=1;i<=Go;){
        //if(dfs(Floor,Building[Floor][Room].Next))
        Index=Building[Floor][Index].Next;
        if(Building[Floor][Index].Up){
            i++;
        }
    }
    dfs(Floor+1,Index);
}
int main(){
//    freopen("treasure.in","r",stdin);
//    freopen("treasure.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            scanf("%d%d",&x,&y);
            Building[i][j].Up=x;
            if(x){
                Ftot[i]++;
            }
            Building[i][j].Num=j;
            Building[i][j].Pointer=y;
            Building[i][j].Next=j+1;
            if(j+1==m){
                Building[i][j].Next=0;
            }
        }
    }
    scanf("%d",&x);
    dfs(1,x);
    printf("%d",ans);
}

看起来是简单轻巧…实际上显然这题是需要小小的优化的。一看那个指示牌上的爆炸数据就知道,如果直接傻兮兮的模拟, 你可能会疯狂跟他绕圈子,最后的结果嘛…当然你是TLE啦!

怎么优化?把指示牌上的数字MOD掉这一层所有的有楼梯的房间的个数就好。虽然我刚打完就想到了这个优化点,并且去做了优化。但发现直接取模之后居然疯狂WA!

无奈之下,只好放弃优化。先拿下模拟辛苦分好了。

出乎意料,辛苦分给的并不低。足足五十分呀同志,一半呐!!

(废话真多)

经过WKJ的指点,所以其实在取模的时候要考虑下直接Mod出0的情况,直接成0的话就会发生奇妙的错误。所以我们不妨把他先-1,最后再加回来就是了。

#include<iostream>
#include<cstdio>
const int Mod=20123;
using namespace std;
struct BedRoom{
    bool Up;
    int Pointer;
    int Num;
    int Next;
}Building[10005][105];
int Ftot[10005];
int n,m,x,y,ans;
void dfs(int Floor,int Room){
    //cout<<"time check "<<Floor<<" "<<Room<<" "<<ans<<endl;
    if(Floor==n){
        //cout<<"End"<<endl;
        ans+=Building[Floor][Room].Pointer;
        ans%=Mod;
        return;
    }
    int Go=Building[Floor][Room].Pointer;
    //cout<<"Go "<<Go;
    ans+=Go;
    ans%=Mod;
    if(Building[Floor][Room].Up==true){
        Go--;
    }
    Go=(Go-1)%Ftot[Floor]+1;
    int Index=Room;
    for(int i=1;i<=Go;i=i){
        //if(dfs(Floor,Building[Floor][Room].Next))
        Index=Building[Floor][Index].Next;
        if(Building[Floor][Index].Up){
            i++;
        }
    }
    dfs(Floor+1,Index);
}
int main(){
//    freopen("treasure.in","r",stdin);
//    freopen("treasure.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=0;j<m;j++){
            scanf("%d%d",&x,&y);
            Building[i][j].Up=x;
            if(x==1){
                Ftot[i]++;
            }
            Building[i][j].Num=j;
            Building[i][j].Pointer=y;
            Building[i][j].Next=j+1;
            if(j+1==m){
                Building[i][j].Next=0;
            }
        }
    }
    scanf("%d",&x);
    dfs(1,x);
    printf("%d",ans);
}

还行吧。代码有点冗杂,但在脑海里的逻辑还是很清晰的。

下一个。

C. 【NOIP2012普及组真题】 摆花

如果说考到以前刷过的作业是幸运,那这个简直就是幸运的1024次方了。

以前的考试考过。

#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN=105;
int n,m;
int a[MAXN];
int dp[MAXN][MAXN];
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    dp[0][0]=1;
    for(int i=1;i<=n;i++)
        for(int k=0;k<=a[i];k++)
            for(int j=0;j<=m-k;j++) 
                dp[i][j+k]=(dp[i-1][j]+dp[i][j+k])%1000007;
    cout<<dp[n][m];
}

i来代表花种类,k代表花的盆数,j代表这种花放的盆数。

状态转移方程:dp[i][k]+=dp[i-1][j]

D. 【NOIP2012普及组真题】文化之旅

最短路径问题。数据量不大,弗洛伊德都可以搞定。但难点在于,文化排斥使得一些路是并不可以走的。

嗯,所以难点难住了我…没想出来,暂时搁置一下。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int MAXN=200;
int n,k,m,s,t;
int Map[MAXN][MAXN];
int Cultrue[MAXN];
int Dis[MAXN][MAXN];
int d[MAXN];
bool v[MAXN];
int Now[MAXN];
int main(){
memset(Map,0x3f,sizeof(Map));
int u,v,l;
//
freopen("culture.in","r",stdin);
//
freopen("culture.out","w",stdout);
scanf("%d%d%d%d%d",&n,&k,&m,&s,&t);
//国家个数,文化种数,道路千万条,起点,终点
for(int i=1;i<=n;i++){
scanf("%d",&Cultrue[i]);
Map[i][i]=0;
}
for(int i=1;i<=k;i++){
for(int j=1;j<=k;j++){
scanf("%d",&Dis[i][j]);
}
}
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&l);
Map[u][v]=min(Map[u][v],l);
Map[v][u]=min(Map[u][v],l);
}
for(int k=1;k<=n;k++){
for(int j=1;j<=n;j++){
for(int i=1;i<=n;i++){
Map[i][j]=min((Map[i][k]+Map[k][j]),Map[i][j]);
}
}
}
cout<<Map[s][t];
}

以上,考场临时骗分的,运气不错,数据里很多都直接无视了文化,所以拿到了90分。 

转载于:https://www.cnblogs.com/Uninstalllingyi/p/10703790.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值