UVa13142 - Destroy the Moon to Save the Earth(水題、英文測驗 )

題目大意

在 T 年後會有一顆隕石撞擊地球!如果讓他撞擊地球會造成數以百計的死亡,這是科學家們想到一個方法,讓月亮來幫地球扛這個隕石。
 
其中 S 是月亮轉地球的速率,D 是如果隕石跟月球互相撞擊還差多少公里,D 可以是正數或負數。
我們知道如果消除月亮 1 ton 可以讓月亮的速度加快 1mm/s,因此科學家可以用武器撞擊月球來讓月球加速;反之,如果我們讓月亮增重 1 ton 則可以讓月亮的速度變慢 1mm/s。

現在請告訴科學家們,要讓月亮消除或增加多少 ton 才可以讓月亮撞擊隕石。 請輸出無條件捨去的 ton
題目連結

重點觀念

  • 英文的閱讀能力
  • 判斷題目的可用資訊

分析

如果你的英文夠好,那你應該會知道其實 S 對我們是沒有用的,因為其實題目的 D 是隕石跟月球互相撞擊還差多少公里,也就是說 D 的標準就是透過 S 的速率去推估,因此我們其實只需要做增加或是減少 S。

怎麼做呢?就是用題目的消除或增加 1 ton。
因此我們的公式就是 \(距離 / 時間\),記得單位要換算,距離的單位是 mm、時間的單位是 s。

再來我們的輸出特別注意

  • floor 是無條件退位,因此 \(abs(floor(-8.4)) = 9 \),並不符合題目要求,因此我們要改成 \(floor(abs(-8.4)) = 8 \)。
  • 判斷是要 remove or add
    題目有說,ton = 0 時必須輸出 add,但是我們判斷是否等於 0 時,假設 ton = 0.3,判斷公式是 if(ton > 0) cout << "Remove " << floor(ton) << " tons\n";,則會輸出 remove,這是因為我們的 if(ton > 0) 這時是 0.3,才會判斷是 true,因此我們要改成 if(floor(ton) > 0) 判斷時就先退位,這樣才會符合題目的正確輸出要求。

心得

我英文真的好爛,需要再複習拉QAQ。
看了題目那麼久,結果一個詳解發現這題目那麼簡單。

我一開始還以為我要知道地球的周長然後去計算月亮速率,2500 公里是隕石跟月亮的距離,還有再算一堆東西,想到就頭疼的…。

參考連結

Uva13142 - Destroy the Moon to Save the Earth

題目程式碼

會在下面放一些簡單註解,供大家學習時參考。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <bits/stdc++.h>
#define LOCAL
using namespace std;

int main()
{
#ifdef LOCAL
freopen("in1.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif // LOCAL
int n;
double t, s, d, ton;

cin >> n;
while(n--){
cin >> t >> s >> d;
//距離 / 時間,記得單位要換算,距離的單位是 mm、時間的單位是 s
ton = d * 1000 * 100 * 10 / (t * 24 * 60* 60);
//小心判斷,注意 0.3 的情況;注意負數時的 floor 會 -1,舉例:floor(-0.3) = -1。
if(floor(ton) > 0) cout << "Remove " << floor(ton) << " tons\n";
else cout << "Add " << floor(abs(ton)) << " tons\n";
}

return 0;
}
  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: