归来第一天 usaco1.3新增三题

一年多之后再次打开usaco,发现新增了三题,于是就做了下。毕竟是getting started,难度也就很低了。

 

    Problem1:Combination Lock

    题意大致是说FJ和他的Lock Maker都拥有对Lock的控制权,FJ拥有一组三元数,LM同样如此。三元数(eg:(2,3,4))每个数字都在1-N这个范围内,只要给出的三元数中每个数字与FJ或LM的三元数距离均不超过2即可打开这把锁,1与N距离可视为1,也就是说这N个数是循环排列的。现在给出FL与LM的三元数,求有多少组三元数能够成为开锁的密钥。

    题目读完,显然当N不超过5时,所有的三元数组均符合题意,答案即为N^3。当N超过5时,倘若与FJ或LM配对的任意三元数组均不发生重合,那么结果即为250。如此,只需统计发生重叠的三元数组即可,我们将FJ与LM各位上的数字进行比较,可以发现当距离为i(i<=5)时,重复的数字将会有(5-i)个,最后相乘即可。

    代码如下:

   

#include<stdio.h>
int main()
{
    FILE *fp1,*fp2;
    fp1=fopen("combo.in","r");
    fp2=fopen("combo.out","w");
    int n,s[3],t[3],i;
    int w=1,v,flag=0;
    fscanf(fp1,"%d",&n);
    for(i=0;i<3;i++)
    fscanf(fp1,"%d",&s[i]);
    for(i=0;i<3;i++)
    fscanf(fp1,"%d",&t[i]);
    if(n>5)
    {
           for(i=0;i<3;i++)
           {
                           if(s[i]==t[i])v=0;
                           else if(s[i]<t[i])v=(t[i]-s[i])<(s[i]+n-t[i])?(t[i]-s[i]):(s[i]+n-t[i]);
                           else v=(t[i]+n-s[i])<(s[i]-t[i])?(t[i]+n-s[i]):(s[i]-t[i]);
                           if(v<5){w*=5-v;flag=1;}
           }
           if(flag)
           fprintf(fp2,"%d\n",250-w);
           else 
           fprintf(fp2,"250\n");
    }
    else
    fprintf(fp2,"%d\n",n*n*n);
    fclose(fp1);
    fclose(fp2);
    return 0;
}

Problem2:Wormholes

乍一看还以为是哪个最短路径的虫洞,当然其实不是。大意是说现在有N个虫洞(N为偶数),问有多少种两两配对方案使得奶牛可能被困住。奶牛始终朝着+x方向行走,从一个虫洞进去,就会从另外一个相应的虫洞出来。跟植物大战僵尸里的某个小游戏有点像哈!

由于N不超过12,我们先用深搜枚举出所有的可能配对方案,再对各个方案进行检验即可。检验时从每个虫洞都进去一遍试试看是否会发生循环就知道奶牛有没有可能被困住了。

但是注意从虫洞进去合出来是两个不一样的状态,所以标记的时候需要注意一下。

代码如下:

 

#include<stdio.h>
int x[12],y[12],match[12],n,ans=0,d[12],p_in[12],p_out[12];
int check_1(int s)
{
    if(p_in[s])return 1;
    p_in[s]=1;
    if(p_out[match[s]])return 1;
    p_out[match[s]]=1;
    int i,min=1000000001,t=100;
    for(i=0;i<n;i++)
    if(x[i]==x[match[s]]&&y[i]>y[match[s]]&&y[i]<min)
    {min=y[i];t=i;}
    if(t<100)return check_1(t);
    return 0;
}
int check()
{
    int i,j;
    for(i=0;i<n;i++)
    {for(j=0;j<n;j++){p_in[j]=0;p_out[j]=0;}if(check_1(i)){printf("%d\n",i);return 1;}}
    return 0;
}
void dfs(int r,int w)
{
     int i,j;
     if(w==n-2)
     {
             for(i=0;i<n;i++)
             if(!d[i]&&i!=r){match[r]=i;match[i]=r;}
             /*
             int i;
             for(i=0;i<n;i++)printf("%d %d\n",i,match[i]);
             printf("\n");
             */
             
             
             if(check())ans++;
             return;
     }
     for(i=r+1;i<n;i++)
     if(!d[i])
     {
               match[r]=i;
               match[i]=r;
               d[i]=1;
               d[r]=1;
               for(j=r+1;j<n;j++)
               if(!d[j])
               {dfs(j,w+2);break;}
               d[i]=0;d[r]=0;
     }
     return ;
}     
int main()
{
    FILE *fp1,*fp2;
    fp1=fopen("wormhole.in","r");
    fp2=fopen("wormhole.out","w");
    int i,j;
    fscanf(fp1,"%d",&n);
    for(i=0;i<n;i++)
    fscanf(fp1,"%d%d",&y[i],&x[i]);
    dfs(0,0);
    fprintf(fp2,"%d\n",ans);
    fclose(fp1);
    fclose(fp2);
   // system("pause");
    return 0;
}

Problem3:Ski Course Design

大意是给出几个高度,求最小代价使得改造后的高度极差不超过17。

考虑到高度在1-100范围内,于是只需枚举所有的最小值与最大值即可(1-18,2-19…),最后求出最小代价。

代码如下:

 

#include<stdio.h>
int n,h[1000],p[1000];
void sort(int l,int r)
{
     int ch=h[(l+r)>>1],i=l,j=r,temp;
     while(i<=j)
     {
                while(h[i]<ch)i++;
                while(h[j]>ch)j--;
                if(i<=j)
                {
                        temp=h[i];
                        h[i]=h[j];
                        h[j]=temp;
                        i++;j--;
                }
     }
     if(l<j)sort(l,j);
     if(i<r)sort(i,r);
     return ;
}
int main()
{
    FILE *fp1,*fp2;
    fp1=fopen("skidesign.in","r");
    fp2=fopen("skidesign.out","w");
    int i,j;
    fscanf(fp1,"%d",&n);
    for(i=0;i<n;i++)
    fscanf(fp1,"%d",&h[i]);
    sort(0,n-1);
    if(h[n-1]-h[0]<=17){fprintf(fp2,"0\n");return 0;}
    int min=2147483647,m,l,r,s,w;
    s=(h[n-1]-h[0]-17)>>1+h[0];
    for(l=s;l>=1;l--)
    {
       r=l+17;              
       m=(h[0]-l)*(h[0]-l)+(h[n-1]-r)*(h[n-1]-r);
       if(m>=min)break;
       for(i=1;i<n-1;i++)
       {
       if(h[i]<l)m+=(l-h[i])*(l-h[i]);
       if(h[i]>r)m+=(r-h[i])*(r-h[i]);
       }
       if(m<min)min=m;
    }
    for(l=s+1;l<=100;l++)
    {
       r=l+17;              
       m=(h[0]-l)*(h[0]-l)+(h[n-1]-r)*(h[n-1]-r);
       if(m>=min)break;
       for(i=1;i<n-1;i++)
       {
       if(h[i]<l)m+=(l-h[i])*(l-h[i]);
       if(h[i]>r)m+=(r-h[i])*(r-h[i]);
       }
       if(m<min)min=m;
    }
    fprintf(fp2,"%d\n",min);
    fclose(fp1);
    fclose(fp2);
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值