牛客竞赛-新手上路-语法入门-顺序结构 .c

1006-1008

输出语句的""中,个别字符的表达

注意:

百分号:%%

单引号,双引号,反斜杠:\对应字符

1017-1018

星期几的计算

注意:

(记星期x,后过了n天)

直接将(n+x)再取余——若正好为7的倍数则结果为0

处理:

(n+x-1)%+1

1021-1023

输出n位数(n=个,十,百...)

处理:

取余法:a=(a/10^(n-1))%10 或 直接计算,反向输出,循环取余并输出

1036

计算差值大小,并排序

注意:

要用绝对值

1039

乘方,开n次方

开n次方可以使用 pow(x,1.0/n) 函数实现

1040 白兔的分身术

n=p^k,求p+k最大值

题目描述:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

白兔学会了分身术。

一开始有一只白兔,接下来会进行k轮操作,每一轮中每一只白兔都会变成p只白兔。

要求k轮后白兔的总数恰好为n。

要求找到两个正整数p,k,最大化p+k

输入描述:

输入一个正整数n(2<=n<=1018)

输出描述:

输出一个整数,p=k的最大值

思路:

1.循环,依次乘方,遍历各个结果,得最后答案——超时

2.自测,得最终结果均为n+1

3.略去中间所有过程,使直接输出n+1——通过

简易理解:

当n可以k次方(k>1)时,必有p+k<n

而一定存在n=n^1,使p+k=n+1>n

故max=n+1

证明:

易得k=logp(n)

设f(p)=logp(n)+p    (2<=p<=n<=1e18)

求导,可得定义域内单调性为单调递增

故,当p=n时f(p)最大,此时k=1

即当p=n,k=1;时p+k取得最大值

代码:

#include<stdio.h>
#include<math.h>
int main()
{/*
    long n,s;
    int i,j,re=0;
    scanf("%ld",&n);
    for(i=n;i>=2;i--)
    {
        for(j=1;(s=pow(i,j))<=n;j++)
        {
            if(s==n&&re<i+j)
                re=i+j;
        }
    }
    printf("%ld",re);
    return 0;
    */
    //运行超时,就测试结果而言,max=n+1
    /*
    证明:易得k=logp(n)
        设f(p)=logp(n)+p    (2<=p<=n<=1e18)
        求导,可得定义域内单调性为单调递增
        故,当p=n时f(p)最大,此时k=1
        即当p=n,k=1;时p+k取得最大值
    */
    long n;
    scanf("%ld",&n);
    printf("%ld",n+1);
    return 0;
}

1041 纸牌

题目描述:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

小w想和你van纸牌

小w有两张纸牌,两张纸牌上都有相同的正整数n

每一轮一张纸牌上的数都可以减去小于等于另外一张纸牌上的数的数

每一轮只能操作和上轮不同的纸牌

小w想知道三轮之后两纸牌上数字之和的最小值

注意,不能减为负数

输入描述:

第一行1个正整数n。

输出描述:

一行一个整数
表示三轮之后两纸牌上数字和的最小值

思路:

类似1040

证明:

不会

代码:

#include<stdio.h>
int main()
{/*由题意,对应直接思路
    long long n,a1,a2,a3;
    int i,j,k;
    scanf("%lld",&n);
    int re=2*n;
    for(i=n;i>=0;i--)
    {
        a1=n-i;
        for(j=a1;j>=0;j--)
        {
            a2=n-j;
            for(k=0;k<=a1&&k<=a2;k++)
            {
                a3=a1-k;//不可以用a1=a1-k,后续本循环中a1会被重复调用
                if(a3+a2<re)//以防a1在调用时值改变,必须另设a3来另外存储计算结果
                    re=a3+a2;
            }
        }
    }
    printf("%lld",re);
    return 0;
    */
    //超时
    //经过几组自测,得出规律
    //就结果而言,re=(n+1)/2    (结果取整)
    //最终代码
    long long n;
    scanf("%lld",&n);
    printf("%lld",(n+1)/2);//向零取整
//实际情况:当n是偶数时,输出n/2;当n为奇数时,输出(n+1)/2。
    return 0;
}

1042 石头剪刀布

题目描述:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

Kaiji正在与另外一人玩石头剪刀布。双方各有一些代表石头、剪刀、布的卡牌,每局两人各出一张卡牌,根据卡牌的内容决定这一局的胜负。胜负规则为:石头赢剪刀、剪刀赢布、布赢石头、相同为平局。每张卡牌至多被使用一次。

已知双方的卡牌数量,问Kaiji最多赢几局?

输入描述:

一行六个数字0 ≤ a, b, c, d, e, f ≤ 50,a,b,c分别表示Kaiji的石头、剪刀、布的牌的数量,d,e,f分别表示此时另一人的石头、剪刀、布的牌的数量。

输出描述:

一个整数表示Kaiji最多赢几局。

代码:

#include<stdio.h>
int main()
{
    int a,b,c,d,e,f,n1,n2,n3,n;
    scanf("%d %d %d %d %d %d",&a,&b,&c,&d,&e,&f);
    n1=(a<e)?a:e;
    n2=(b<f)?b:f;
    n3=(c<d)?c:d;//Kaiji赢最多局,则让其尽可能多的让a与e,b与f,c与d配合
    n=n1+n2+n3;
    printf("%d",n);
    return 0;
}

1043 假动态仙人掌

题目描述:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

珂朵莉想每天都给威廉送礼物,于是她准备了n个自己的本子

她想送最多的天数,使得每天至少送一个本子,但是相邻两天送的本子个数不能相同

珂朵莉最多送几天礼物呢

输入描述:

第一行一个整数n

输出描述:

第一行输出一个整数,表示答案

思路:

最佳分配方式:1,2,1,2,1,2......

一个1,2为一周期,存在不完整周期算作为1

故,re=(n/3)*2+1

代码:

#include<stdio.h>
int main()
{
    int n,k,re;
    scanf("%d",&n);
    k=n%3;
    if(k==0) re=2*n/3;
    else re=n/3*2+1;
    printf("%d",re);
    return 0;
}

1044 旅游观光

题目描述:

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

有n个地方,编号为1->n,任意两个地方有公交车,从i到j的票价为(i+j)mod(n+1),而且这个票可以用无限次,你要把这些地方全部走一遍,问最小花费为多少。可以在任意地方开始和结束。

输入描述:

第一行一个数n

输出描述:

输出一行一个数表示答案

代码:

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    //1+n,2+(n-1),...之间搭配票价为0,共有(n+1)/2组[取整](单独剩下的记作1)
    //组与组之间的同行最少花费1,按2+n,3+(n-1),...搭配,共((n+1)/2-1)组
    printf("%d",(n+1)/2-1);
    return 0;
}

1045 [NOIP2002]自由落体

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

在高为 H 的天花板上有 n 个小球,体积不计,位置分别为 0,1,2,….n-1。在地面上有一个小车(长为 L,高为 K,距原点距离为 S1)。已知小球下落距离计算公式为 d=1/2*g*(t^2),其中 g=10,t 为下落时间。地面上的小车以速度 V 前进。如下图:

小车与所有小球同时开始运动,当小球距小车的距离 <= 0.00001 时,即认为小球被小车接受(小球落到地面后不能被接受)。

请你计算出小车能接受到多少个小球。

输入描述:

输入H,S1,V,L,K,n (l<=H,S1,V,L,K,n<=100000)

输出描述:

输出小车能接受到的小球个数。

题目分析:

本质为数学计算题目,分情况讨论并计算。

思路:

由物理公式得 t1(小球落到小车顶部水平面对应时刻), t2(小球落地时刻),x1(最右侧可接收到的对应位移),x2(最左侧可接受到的对应位移)。

开始分情况讨论:具体见代码部分

  1. 小车可接收范围在小球分布范围之外
  2. 小车可接收范围与小球分布范围有重合

代码:

#include<stdio.h>
#include<math.h>
int main()
{
    double h,s1,v,l,k,t1,t2,x1,x2;
    int n,re;
    scanf("%lf %lf %lf %lf %lf %d",&h,&s1,&v,&l,&k,&n);
    t1=sqrt((h-k)/5);//小球到达小车顶部平面的时刻t1
    t2=sqrt(h/5);//小球落到地面的时刻t2
    x1=(s1-t1*v+l);//t1时刻车尾位置(最右端可接收对应位置)
    x2=(s1-t2*v);//t2时刻车头位置(最左端可接受对应位置)
    //分情况讨论1,2:
    //情况1,所有小球不在可接收范围内
    if(x2>n-1+0.00001||x1<-0.00001)
        re=0;//x2>最右侧小球位置 或 x1<最左侧小球位置时
    else
    //情况2,存在小球在接收范围内:
    {
        int max,min;
        //min(最左侧可接受到的小球编号-1)
        //max(最右侧可接受到的小球编号)
    //max取值:
        //最右端小球在接收范围内时:
        if(x1>=n-1-0.00001) max=n-1;
        //当x1在(floor(x1)+1)的接收范围时,
        //即(x1-floor(x1))>=0.99999时:
//x1小数点后的数>=0.99999时,会被大于x1的一个整数接收,
//但floor运算会将其归入一个小于x1的整数,
//因此如下情况会对floor运算的结果+1
        else if(x1-floor(x1)>=0.99999) max=floor(x1)+1;
        //大多数的一般情况(除去前两种的情况):
        else max=floor(x1);
    //min取值:
        //最左端小球在接收范围内时:
        if(x2<=0.00001) min=-1;
        //当x2在(floor(x2))的接受范围内时,
        //即(x2-floor(x2))<=0.00001时:
//x2小数点后的数<=0.00001时,会被floor(x2)接收
//因此floor(x2)无法表示 可以被接受的最小编号-1,即变量min
//因此如下情况会对floor运算的结果-1
        else if(x2-floor(x2)<=0.00001) min=floor(x2)-1;
        //大多数的一般情况(除去前两种的情况):
        else min=floor(x2);
        //结果=最大编号-(最小编号-1),即max-min
        re=max-min;
    }
    printf("%d",re);
    return 0;
}

参考的他人的代码思路: 

思路1:循环,从0开始,依次判断是否落到接收区间 (x1~x2) 内,如果是,则计数+1(此思路结果准确,容易想到)

思路2:将判断标注换为时间,本质不变

思路3(另一种代码):前半段代码基本一致,但if else{}内容有所改变,如下:

    if(x2>n-1+0.00001||x1<-0.00001)
        re=0;
    else
    {
        max=(x1<n-1+0.00001)?floor(x1):n;
        min=(x2>-0.00001)?floor(x2):0;
         re=max-min;
    }

        不明白为什么就ac了……直观感受这个很不严谨,一些情况并没有讨论到……搞不明白(QAQ)

1047 得不到的爱情

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

题目描述

Chranos是个数学天才。

一天,有一个可爱的小女孩追求Chranos,他知道Chranos最喜欢当且仅当总质量为K克的时候的番茄炒蛋了。她希望通过美食俘获Chranos的胃,这样就一定可以和他在一起了吧!虽然小女孩有无限数量的食材,但是数学王国的番茄和蛋非常特殊,他们的质量分别为N克和M克。为了表现一颗完整的心、表达充足的爱意,所有的食材必须被用完。N和M都是正整数且互素,制作过程中既不会凭空增加质量,也不会凭空消失质量。

Chranos不希望小女孩打扰他学数学。他发现,并不是所有番茄炒蛋都是可以被制作出来的。他想找出最大的不可以被制作出的总质量K来拒绝小女孩,这样Chranos就可以永远和数学在一起了!

输入描述:

第一行为正整数N和M(2≤N,M≤50000)(2 \leq N, M \leq 50000)(2≤N,M≤50000)。

输出描述:

输出最大的不可以被制作出的总质量K。

做题时的思路:

无,只知道本质是数学问题

代码:

#include<stdio.h>
int main()
{
    long m,n;
    scanf("%ld %ld",&m,&n);
    printf("%ld",m*n-m-n);
    return 0;
}

或许可以实操的思路:

易知,两互素的最小公倍数为m*n,则 re(最大的不可以用两个整数数的a,b(非负整数)倍之和表示的数)必定在m*n之内,举例多组数据,从m*n到1,逐个验证,找出规律

本题采用的定理:赛瓦维斯特定理

已知 (a), (b)为大于 (1)的正整数, (gcd (a,b)=1) ( (a,b)互质),则使不定方程 (ax+by=C)不存在非负整数解的最大整数 (C=a*b−a−b)。

注释:

gcd:最大公约数

证明:

不会

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值