zoukankan      html  css  js  c++  java
  • 入门算法题——数学篇(一)

    转载请注明出处:http://www.cnblogs.com/xianyue

    题1:矩形大剧院

    题目描述

    某座城市决定在一块形状为 长为 n、宽为 m 的矩形地面上铺上边长为 a 的正方形地板,并且在这块地基的基础上建造一个大剧院。要求不能弄破地板,并且地板的边要和矩形边平行(地板可以超出矩形地面区域,但是一定要保证矩形地面被地板占满)。问:告诉你n,m和a,至少需要几块地板才能把矩形地面铺满?

    输入

    一行包括三个正整数n,m,a(1<=n,m,a<=10^9)

    输出

    输出需要的最少地板数。

    样例输入

    6 6 4

    样例输出

    4

    题解

    可以发现答案是⌈n/a⌉*⌈m/a⌉。

    代码

    #include <iostream>
    using namespace std;
    long long n, m, a;
    int main()
    {
        cin >> n >> m >> a;
        cout << ((n+a-1)/a) * ((m+a-1)/a) << endl;
        return 0;
    }
    

    题2:分西瓜

    题目描述

    一个炎热的夏天小明和丁丁打完篮球,再回来的路上买了一个西瓜。
    然后它们回答了家里,发现桌子上放着一个电子秤,然后它们就用电子秤称了一下西瓜的重量,发现习惯正好是w斤(w恰巧是一个整数),小明和顶顶就准备分西瓜,但是小明逍遥自己分得的西瓜的重量正好是偶数斤,顶顶也希望自己分得的西瓜的斤数也是偶数斤,请问有没有这种可能将w斤的西瓜分成两个偶数斤重的半个西瓜。如果有可能则输出“Yes”,否则输出“No”。

    输入

    西瓜的重量w(斤)。

    输出

    如果有可能将w斤的西瓜分成两个偶数斤重的半个西瓜,则输出“Yes”,否则输出“No”。

    样例输入

    8

    样例输出

    8

    题解

    这道题其实是问你给你一个数w,如果w能够表示成两个正偶数的和,则输出“Yes”,否则输出“No”。可以发现任何大于2的偶数都满足这个条件。

    代码

    #include <iostream>
    using namespace std;
    int w;
    int main()
    {
        cin >> w;
        if (w > 2 && w % 2 == 0)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
        return 0;
    }
    

    题3:多米诺骨牌

    题目描述

    给你一个长为 M 宽为 N 的矩形区域,并且给你用不完数量的长为 2 宽为 1 的多米诺骨牌。要求将多米诺骨牌放入这个矩形区域,同时满足以下条件:

    1. 每一个多米诺骨牌刚好占满矩形区域内的两个格子;
    2. 任意两个多米诺骨牌不会重叠;
    3. 任意一个多米诺骨牌必须在矩形区域内,允许多米诺的边界触碰到矩形区域的边界。

    求:按照上述规则,你能够放到矩形区域内的最多的多米诺骨牌的数量。

    输入

    一行包括两个正整数 M 和 N,分别表示矩形区域的长和宽。

    输出

    输出按照上述规则,你能够放到矩形区域内的最多的多米诺骨牌的数量。

    样例输入1

    2 4

    样例输出1

    4

    样例输入2

    3 3

    样例输出2

    4

    题解

    很容易看出这道题的答案是⌊M*N/2⌋。

    代码

    #include <iostream>
    using namespace std;
    int m, n;
    int main()
    {
        cin >> m >> n;
        cout << m * n / 2 <<endl;
        return 0;
    }
    

    题4:士兵与香蕉

    题目描述

    一个士兵想要在一家超市里面买w根香蕉,已知他买第1根香蕉需要花费k元钱,买第2根香蕉需要话费2k元钱,……,买第i根香蕉需要花费ik元钱,……
    该士兵现在有n元钱,如果他的钱不够,他就需要问他的士兵朋友们借钱去买香蕉。问士兵需要问他的室友借多少钱?

    输入

    输入包括一行三个证书k,n,w(1<=k,w<=1000,0<=n<=10^9),分别表示第一根香蕉的花费、士兵一开始拥有的钱的元数、士兵需要购买的相交的数量。

    输出

    士兵需要向他的士兵朋友借的钱数。如果士兵不需要借钱,则答案为0。

    样例输入

    3 17 4

    样例输出

    13

    题解

    这道题主要就是求购买w根香蕉的花费。用到了高斯求和。
    k+2*k+...+w*k=(1+2+...+w)*k=(1+w)*w/2*k

    代码

    #include <iostream>
    using namespace std;
    int k, n, w, res;
    int main()
    {
        cin >> k >> n >> w;
        res = w * (w + 1) /2 * k - n;
        if (res < 0)
            res = 0;
        cout << res << endl;
        return 0;
    }
    

    题5 数绵羊

    题目描述

    一个夜黑风高的晚上小爱丽丝睡不着觉,于是他决定数绵羊,但是光数绵羊的话总感觉很无聊,所以他决定:

    • 每数m只绵羊就让这第k只绵羊被平底锅击中
    • 每数n只绵羊就让这第l只绵羊的尾巴被门夹住

    就这样小爱丽丝数了d只绵羊然后睡着了,请问在这d只绵羊中有多少只绵羊受到了伤害?

    输入

    输入包括三行。
    第一行一个整数m。
    第二行一个整数n。
    第三行一个整数d。

    输出

    输出一个受伤的绵阳的数量。

    样例输入

    2
    3
    7

    样例输出

    4

    题解

    可以发现:
    被平底锅击中的绵羊的数量为 ⌊d/m⌋
    尾巴被门夹住的绵羊的数量为 ⌊d/n⌋
    但是上述两者的和中重复计算了一个数值,即是同时被平底锅击中以及尾巴被门夹住的绵羊的数量为⌊d/(mn)⌋
    所以可以求得最终的答案为:
    ⌊d/m⌋+⌊d/n⌋-⌊d/(m
    n)⌋

    代码

    #include <iostream>
    using namespace std;
    int m, n, d;
    int main()
    {
        cin >> m >> n >> d;
        cout << d/m + d/n - d/(m*n) << endl;
        return 0;
    }
    
  • 相关阅读:
    iOS.访问通讯录.01.读取联系人信息
    iOS.定位服务与地图应用.07.调用谷歌Web地图
    iOS.定位服务与地图应用.06.调用iOS苹果地图
    iOS.定位服务与地图应用.05.跟踪用户位置变化
    iOS.定位服务与地图应用.04.使用iOS苹果地图
    iOS.定位服务与地图应用.03.地理信息编码查询
    iOS.定位服务与地图应用.02.地理信息反编码
    Java中的基本数据类型在内存所占字节
    APK文件反编译
    基于Android系统开发的简易音乐播放器
  • 原文地址:https://www.cnblogs.com/xianyue/p/7128265.html
Copyright © 2011-2022 走看看