入門算法題——數學篇(一)


轉載請注明出處: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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM