算法刷题

今天犯了致命的错误:c语言中没有引用,害我错误找了半天,果然基础还是不行

int main()
{
    int a=0,b,c;
    int &s=a;
    return 0;
}

编译出错 error C2143: 语法错误 : 缺少“;”(在“&”的前面)

问题一:
问题描述:
Bob和Alice有个约会,一大早Bob就从点(0,0)出发,前往约会地点(a,b)。Bob没有一点方向感,因此他每次都随机的向上下左右四个方向走一步。简而言之,如果Bob当前在(x,y),那么下一步他有可能到达(x+1,y), (x-1,y), (x,y+1), (x,y-1)。很显然,当他到达目的地的时候,已经很晚了,Alice早已离去。第二天,Alice质问Bob为什么放她鸽子,Bob说他昨天花了s步到达了约会地点。Alice怀疑Bob是不是说谎了。你能否帮她验证一下?

代码如下:

#include  <stdio.h>
#include  <stdlib.h>

int main()
{
    int a,b,s;
    //printf("请输入三个整数a,b,s:");
    scanf("%d %d %d",&a,&b,&s);
    a=a>0?a:(-a);
    b=b>0?b:(-b);
    if(s-a-b<0)  printf("No");
    else if((s-a-b)%2==0)  printf("Yes");
    else printf("No");
    return 0;
}

问题二
问题描述:原来,面试官的手机被他调皮的儿子小明用一个数字作为密码锁上了。
小明只记得这个数字的十进制范围是l~r,且这个数的二进制表示中恰有m个1,却不记得确切的数字了。
面试官可急坏了。这才有了小赛一个将功赎过的机会。
他想要让小赛算出,他最坏情况下,要试多少次密码才能确保打开手机呢?
请输出这个次数。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int a,b,m,i,c,co,count=0;
    scanf("%d %d %d",&a,&b,&m);
    for (i=a;i<=b;i++)
    {
        c=i;
        co=0;
        while (c)
        {
            c=c&(c-1);
            co++;
        }
        if(co==m) count++;
    }
    if(count>0) printf("%d",count);
    else printf("-1");
//  system("pause");
    return 0;
}

问题三
问题描述:有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?
注:规定从一级到一级有0种走法。

#include <stdio.h>
/*上台阶*/
int fun(int a)
{
    if(a<1)  return -1;
    if(a==1) return 0;
    else if(a==2) return 1;
    else if(a==3) return 2;
    else return (fun(a-1)+fun(a-2));
}

int main()
{
    int n,i,A[100],num;
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {
        scanf("%d",&A[i]);
    }
    for (i=0;i<n;i++)
    {
        num=fun(A[i]);
        printf("%d\n",num);
    }
    system("pause");
}

问题四
问题描述:说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。相似率越高,则约德尔的未来越光明。
请问:相似率为多少?

#include <string.h>
#include <stdio.h>
#define NUM(x)  (x>='0'&&x<='9')
#define ACS(x)  ((x>='a'&&x<='z') ||(x>='A'&&x<='Z'))

int main()
{
    int i=0;
    char str1[1000],str2[1000];
    char *p,*q;
    gets(str1);
    gets(str2);
    p=str1;
    q=str2;
    while (*p!='\0'&&*q!='\0')
    {
        if (*q=='1'&&(NUM(*p)||ACS(*p)) )
        {
            i++;
        }
        else if(*q=='0'&&(!NUM(*p)&&!ACS(*p)) )
        {
            i++;
        }
        p++;q++;
    }
    printf("%4.2f%",((float)i*100/(strlen(str1))));
    system("pause");
    return 0;
}

问题五:

问题描述:一个公交车经过n个站点,乘客从前门上车,从后门下车。
现在统计了在第i个站,下车人数a[i],以及上车人数b[i]。
问公交车运行时候车上最多有多少乘客

#include <stdio.h>
int main()
{
    int i,n,a[100],b[100],max=0,sum=0;
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {
        scanf("%d %d",&a[i],&b[i]);
        sum+=(b[i]-a[i]);
        max=max<sum?sum:max;
    }
    printf("%d",max);
    system("pause");
    return 0;
}

问题六
问题描述:考研有4门科目,分别是政治(满分100分),英语(满分100分),数学(满分150分)和专业课(满分150分)。
某校计算机专业今年录取研究生的要求是:政治、英语每门课成绩不低于60分,数学和专业课不低于90分,总成绩不低于310分。并且规定:在满足单科以及总成绩最低要求的基础上,350分以上(含350分)为公费(Gongfei),310分~349分为自费(Zifei)。
请编程判断考生的录取情况。

#include <stdio.h>

int main()
{
    int i,n,A[1000][4],sum;//数组太小也有错
    scanf("%d",&n);
    for (i=0;i<n;i++)
    {       
        scanf("%d %d %d %d",&A[i][0],&A[i][1],&A[i][2],&A[i][3]);       
    }
    for(i=0;i<n;i++)
    {
        sum=A[i][0]+A[i][1]+A[i][2]+A[i][3];
        if (A[i][0]>=60&&A[i][1]>=60&&A[i][2]>=90&&A[i][3]>=90&&sum>=310)
        {
        //  if(sum<310) printf("Fail\n");
          if(sum>=350) printf("Gongfei\n");
            else printf("Zifei\n");
        }
        else
        {
            printf("Fail\n");
        }

    }
//  system("pause");
    return 0;
}

问题七 下起楼来我最快
问题描述:小赛的家在楼层n,当前电梯停在的楼层m,
以及电梯每经过一层楼的时间t1,开门时间t2,关门时间t3,还有小赛每下一层楼的时间t4,
让你帮小赛计算一下,他最快到达第1层的时间。

#include <stdio.h>
#include <math.h>

int main()
{
    long  m,n;
    long  t1,t2,t3,t4,sumt,sumx;
    scanf("%ld%ld",&n,&m);
    scanf("%ld%ld%ld%ld",&t1,&t2,&t3,&t4);
    sumt=(n-1)*t4;
    sumx=abs(n-m)*t1+t2+t3+t1*(n-1)+t2;
    sumt=(sumt<sumx)?sumt:sumx;
    printf("%ld",sumt);
    return 0;
}

问题七认老乡
问题描述:大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?
输入:每个测试实例首先包括2个整数,N(1 <= N <= 1000),M(0 <= M <= N*(N-1)/2),代表现有N个人(用1~N编号)和M组关系;
在接下来的M行里,每行包括2个整数,a,b,代表a跟b是同乡;
当N = 0,M = 0输入结束;
已知1表示小赛本人。

#include<stdio.h>
int root[1001];
int findroot(int x){
    if(root[x]==x)
        return x;
        else {
            int c=findroot(root[x]);
            root[x]=c;
            return c;
        }
}
int main(){
    int n,m;
    while(scanf("%d %d",&n,&m)&&(n!=0||m!=0)){
           for(int i=1;i<=n;i++){
                root[i]=i;
           }
            for(int i=0;i<m;i++){
                int a,b;
                scanf("%d %d",&a,&b);
                int x=findroot(a);
                int y=findroot(b);
                if(x!=y){
                    root[y]=x;
                }
            }
            int countx=0;
            for(int i=2;i<=n;i++){
                if(findroot(i)==findroot(1))
                    countx++;
            }
            printf("%d\n",countx);
    }
    return 0;
}

/这个看不懂什么意思,还是水平不够,虽然结果是对的/
虽然多多少少理解了,但是如果纯自己写就不会了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值