OJ算法可运行①

OJ算法题共10个篇幅,不定期在篇幅里增加题目(篇幅不增加)。

个人水平有限,如有错误和可以改进的地方,非常期待批评指正,谢谢!

题目描述

计算a+b

输入

第一个数为数据组数n,接下来n行,每行2个整数a, b(保证a, b, a+b在int范围内)
输出

对于每组数据,输出一行,为 a+b 的值
输入样例

2
1 2
2 3

输出样例

3
5

#include <stdio.h>
int main()
{
    int n;
    int a,b;

    scanf("%d", &n);

    while(n--){
        scanf("%d%d",&a, &b);
        printf("%d\n",(a+b));
    }

    /* // 或用如下for循环代替while循环
    int i;
    for(i=0; i<n; i++){
        scanf("%d%d",&a, &b);
        printf("%d\n",(a+b));
    }
    */

    return 0;
}

题目描述

求两个整数的余数。
输入

两个正整数n, m。
输出

输出一个整数,为n除以m的余数。
输入样例

12 5

输出样例

2

#include<stdio.h>
int main(){
    int a,b;
    //scanf("%d",&n);
   // for(int i=0;i<n;i++){
        scanf("%d%d",&a,&b);
        printf("%d",(a%b));
   // }
    return 0;
}

题目描述

BlueFly是一个壕,
他有一大堆的挖掘机,通过挖掘机发家致富。
他不仅是厨师,
还是黑客,
还是高级技师,
拥有十八般武艺。。。
BlueFly是个壕,他有一个妹妹叫FlySnow。(脑洞不要太大。。)
BlueFly每天都要给他的妹妹发糖吃,第一天他给他妹妹发了n个糖,以后每天发的糖的数量比前一天多m个。 请问k天以后BlueFly总共发了多少块糖。(假定FlySnow都能吃完这些糖 233)
输入

输入多组数据。
每组数据只有一行,是三个正整数,分别为n,m,k,保证每个数都在int范围内。
输出

输出这k+1天中FlySnow总共吃了多少糖,保证输出结果在int范围内。
输入样例

 1 1 2
 1 2 2

输出样例

6
9

样例解释

第一天吃糖数量为1,每天比前一天多吃一块,2天后吃糖数量为1+2*1=3块。总共吃糖的个数就是1+2+3=6。总共吃了3天,而不是2天。
输入提示

用while(scanf("%d%d%d",&a,&b,&c) != EOF)来进行多组输入的控制,输入结束的标志是EOF。

#include<stdio.h>
int main(){
    int n,m,k;
    while(~(scanf("%d%d%d",&n,&m,&k))){
        int sum;
        sum=n;
        int two;
        two=sum;
        for(int i=0;i<k;i++){
            two=two+m;
            sum=sum+two;
        }
        printf("%d\n",sum);
    }
    return 0;
}

OJ算法题共20个篇幅,不定期在篇幅里增加题目(篇幅不增加)。

个人水平有限,如有错误和可以改进的地方,非常期待批评指正,谢谢!

题目描述
给你一非降序数列,以及一组查询,查询某一特定元素是否存在于数列之中,如果存在,则输出该元素首次出现的位置,否则输出"error"。

输入
多组测试数据。 对于每组数据,第一行为两个整数n,m(1<=n,m<=250000),表示数列中有n个元素以及m次查询。 第二行包含n个正整数,用空格分隔,表示有序数列。 接下来m行,每行一个整数,表示每次查询的元素。

输出
输出m行,每行输出内容见题目描述及样例

输入样例
5 3
1 2 3 4 5
3
5
7
输出样例
3

error
Hint
注意是下界二分查找

#include<stdio.h>
int main(){
    int n,m,num;
    while(~scanf("%d%d",&n,&m)){
        int a[n];
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=0;i<m;i++){
            scanf("%d",&num);
            int j=0;
            for(j;j<n;j++){
                if(num==a[j]){
                    printf("%d\n",j+1);break;
                }
            }
            if(j==n) printf("error\n");
        }
    }
    return 0;
}

我们用O和X分别表示现物和搏筋兜牌。
  假设有3次舍牌,我们可以很容易地枚举出所有排列方式:OOO, OOX, OXO, XOO, XOX,我们把每一个这样的一个序列叫做一种舍牌方式。

  为了方便讨论,我们给出如下定义:
F(n) = n次舍牌中不同的舍牌方式数

  比如上面的例子中,F(3) = 5。

  我们来尝试推导具有普适性的公式:
  假设F(n-2)种舍牌方式中,有m次以现物结束(类似于OXOXXX……O),F(n-2) - m次以搏筋兜牌结束(类似于OXOXXX……X)。
  对于类似OXOXXX……O的舍牌方式,下一次舍牌既可以是O也可以是X,所以下一次有2*m中舍牌方式;对于类似OXOXXX……X的舍牌方式,下一次只能是O,所以下一次舍牌有F(n-2) - m种方式。
  我们把两种舍牌方式数相加,就得到:
F(n-1) = 2*m + F(n-2) - m = F(n-2) + m

  同理,由上面的推理结论,F(n-1)中有F(n-2)次以O结束,m次以X结束,所以:

F(n) = 2*F(n-2) + m = (F(n-2) + m) + F(n-2) = F(n-1) + F(n-2)

  而这就是斐波那契数列的递推公式。

Part 2 取模运算的处理技巧

  题目中要对其进行取模处理。这里需要补充一个结论:
斐波那契数列对某个整数取模的结果构成循环数列

  这个结论的证明很繁琐,故不在此列出,可以去这篇博文下查看: http://blog.csdn.net/ACdreamers/article/details/25616461
  由于时间和空间有限,不可能使用递归方法对于每一个输入值进行求解。故进行预处理操作,把一个周期内的斐波那契数取模后的结果存入数组。对于之后的每一次查询,只需要用循环周期对其进行取模操作,然后根据余数直接读取数组里保存的值。
 


#include <iostream>
#define INF 0xFFFFFF
using namespace std;
int remainders[100000];//取余后的斐波那契数列,仅保存一个周期的数
int T = 2;//循环节

void calFibonacciRemainders()
{
    remainders[0] = 1;
    remainders[1] = 2;
    while (1)
    {
        remainders[T] = (remainders[T - 1] + remainders[T - 2]) % 100007;
        if (remainders[T] == remainders[1])
        {
            T--;
            break;
        }
        T++;
    }
}

int main()
{
    calFibonacciRemainders();
    int n;
    while (cin >> n)
    {
        n %= T;
        if (n == 0)
            n = T;
        cout << remainders[n] << endl;
    }
}

题目描述
jhljx又决定来出题了,上次上机以后有人说他是黑心学长,,噗。。。
肿么可以这样。。
松辰学妹对jhljx说不要不要丧心病狂。。jhljx说我给你出一道题,你要是答对了,你就赢了。。
松辰学妹说这还不简单啊。。
于是jhljx给了松辰学妹一个长度为n的数列A1,A2,A3……An。他说你能找出这个序列中a[i]-a[j]的最大值吗(保证i<j)?
松辰学妹说用数组啊。。jhljx说,没学数组,不准用。。用了你就跪了。。 松辰学妹说好吧。。这可怎么办呢?

输入
输入多组数据。
每组数据两行,第一行是一个正整数n(2<=n<=1000000)。第二行是n个数,每个数之间用空格隔开。保证这些数在int范围内。

输出
输出满足条件的最大值。

输入样例
2
100 20
输出样例
80
Hint
这道题尽量不要用数组,因为没有学。不用数组完全可以做。
PS:这道题没有去刻意卡内存。。

#include<cstdio>
#include<iostream>
using namespace std;
int main(){
    int n,i;
    long long a0,a1,maxV,maxGap,last,ai;
    while((scanf("%d",&n)) != EOF){
        cin >> a0 >> a1;
        maxGap = a0 - a1;
        maxV = a0;
        last = a1;
        for(i = 2;i < n;i++){
            cin >> ai;
            if(last > maxV)
                maxV = last;
            if(maxV - ai > maxGap)
                maxGap = maxV - ai;
            last = ai;
        }
        cout << maxGap << endl;
    }
}

上一篇

下一篇

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磊磊cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值