Zerojudge 第三屆簡單的小競賽題解
簽到 (Zerojudge_f026不公開)
題目:輸出 $2021!!!$
解法:輸出。
#pragma GCC optimize("O3")
#include <iostream>
using namespace std;
int main() {
cout << "2021!!!\n";
}
規則說明 (Zerojudge_f027不公開)
題目:輸入帳密,輸出帳密。
解法:輸出帳密。
#include <iostream>
using namespace std;
int main() {
string str;
cin >> str;
for (int i = 0; i < str.length(); i++) {
if (str[i] == '+')
cout << '\n';
else
cout << str[i];
}
cout << "\nLog in\n";
}
1. 位數 (Zerojudge_f356練習題)
題目:輸出數字長度。
解法:使用字串。
#pragma GCC optimize("O3")
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio (false);
cin.tie (0);
string str;
while (cin >> str)
cout << str.length() << '\n';
}
2. Say HELLO! (Zerojudge_e412練習題)
題目:輸出 $\text{HELLO,} +$ 字串。
解法:要讀取整行。
#pragma GCC optimize("O3")
#include <iostream>
using namespace std;
int main() {
string str;
while (getline (cin, str))
cout << "HELLO," << str << '\n';
}
3. Shady的複製品 (Zerojudge_f360)
題目:輸入 $n$,輸出 $n-1$。
解法:大數。
#pragma GCC optimize("O3")
#include <iostream>
using namespace std;
int main() {
string str;
while (cin >> str) {
for (int i = str.length() - 1; i >= 0; i--) {
if (str[i] == '0')
str[i] = '9';
else {
str[i]--;
break;
}
}
if (str[0] == '0')
cout << str.substr (1, str.length() - 1) << '\n';
else
cout << str << '\n';
}
}
4.階乘 (Zerojudge_f357練習題)
題目:輸入 $n$,輸出 $n!$ 的位數。
解法:將 $log(1)+log(2)+log(3)+...+log(n)$ 再加 $1$ 取整數。($log$ 以 $10$ 為底)
#pragma GCC optimize("O3")
#include <iostream>
#include <cmath>
using namespace std;
int main() {
ios::sync_with_stdio (false);
cin.tie (0);
int n;
while (cin >> n) {
double ans = 0;
for (int i = 1; i <= n; i++)
ans += log10 (i);
cout << (int) ans + 1 << '\n';
}
}
5. 貝瑞的鐵線體積 (Zerojudge_f332)
題目:輸入多項式函數 $f(x)$ 的各項係數,輸入邊界 $a,b$,求函數繞 $x$ 軸的體積。
解法:將每一個點對應的面積加起來 $πr^2=πf(x)^2$,然後 $a$ 到 $b:∫πf(x)^2dx$,不用考慮正負,因為平方出來為正。(原本有一題算面積,但是精準度不夠高,沒有人解出來,所以我就刪了)
#pragma GCC optimize("O3")
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
const double pi = acos (-1);
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
int ar[n + 1];
for (int i = n; i >= 0; i--)
cin >> ar[i];
double arr[2 * n + 1] = {0};
for (int i = n; i >= 0; i--)
for (int j = n; j >= 0; j--)
arr[i + j] += ar[i] * ar[j];
for (int i = 2 * n; i >= 0; i--)
arr[i] /= (i + 1);
double a, b, suma = 0, sumb = 0;
cin >> a >> b;
for (int i = 2 * n; i >= 0; i--)
suma = suma * a + arr[i];
suma *= a;
for (int i = 2 * n; i >= 0; i--)
sumb = sumb * b + arr[i];
sumb *= b;
cout << fixed << setprecision (2) << pi* (sumb - suma) << '\n';
}
}
6. 彼得的誤差率 (Zerojudge_f362)
題目:誤差率定義為 $| ( x -n ) / x |$,$x$ 為正確答案,$n$ 為算出來的答案,給你 $n$,求 $| ( x -n ) / x |=x$的解。
解法:將原式化成兩個一元二次方程式,求根,然後去掉小於等於 $0$ 的。
#pragma GCC optimize("O3")
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <iomanip>
using namespace std;
double rou (double n) {
n *= 100;
if (n - (int) n < 0.5)
return double ( (int) n) / 100;
return double ( (int) n + 1) / 100;
}
int main() {
double n;
while (cin >> n) {
vector<double>ans;
if (1 + 4 * n >= 0) {
double num = rou ( (-1 + sqrt (1 + 4 * n)) / 2);
if (num > 0)
ans.push_back (num);
num = rou ( (-1 - sqrt (1 + 4 * n)) / 2);
if (num > 0) {
bool is = 0;
for (int i = 0; i < ans.size(); i++)
if (num == ans[i]) {
is = 1;
break;
}
if (is == 0)
ans.push_back (num);
}
}
if (1 - 4 * n >= 0) {
double num = rou ( (1 + sqrt (1 - 4 * n)) / 2);
if (num > 0) {
bool is = 0;
for (int i = 0; i < ans.size(); i++)
if (num == ans[i]) {
is = 1;
break;
}
if (is == 0)
ans.push_back (num);
}
num = rou ( (1 - sqrt (1 - 4 * n)) / 2);
if (num > 0) {
bool is = 0;
for (int i = 0; i < ans.size(); i++)
if (num == ans[i]) {
is = 1;
break;
}
if (is == 0)
ans.push_back (num);
}
}
sort (ans.begin(), ans.end());
if (ans.size() == 0)
cout << "NULL\n";
else {
for (int i = 0; i < ans.size(); i++)
cout << fixed << setprecision (2) << ans[i] << ' ';
cout << '\n';
}
}
}
中場休息 (Zerojudge_f029不公開)
題目:輸入 $n$,輸出 $0\times n$。
解法:輸出。
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 0; i <= n; i++)
cout << i << ' ';
}
7. 家豪的回家作業 (Zerojudge_f368)
題目:輸入字串,輸出 $1/2^{\text{RED} 跟 \text{GREEN} 的個數}$。
解法:大數。
#pragma GCC optimize("O3")
#include <iostream>
#include <vector>
#include <iomanip>
using namespace std;
const int mod = 1000000000;
vector<int>vec;
void mult() {
int num = 0;
for (int i = 0; i < vec.size(); i++)
vec[i] = vec[i] * 2 + num, num = vec[i] / mod, vec[i] %= mod;
if (num)
vec.push_back (num);
}
void out() {
cout << vec[vec.size() - 1];
for (int i = vec.size() - 2; i >= 0; i--)
cout << setfill ('0') << setw (9) << vec[i];
cout << '\n';
}
int main() {
string str;
while (cin >> str) {
vec.clear();
int sum = 0;
string s3 = " ", s5 = " ";
for (int i = 0; i < str.length(); i++) {
for (int j = 0; j < 2; j++)
s3[j] = s3[j + 1];
for (int j = 0; j < 4; j++)
s5[j] = s5[j + 1];
s3[2] = s5[4] = str[i];
if (s3 == "RED")
sum++;
if (s5 == "GREEN")
sum++;
}
cout << "1/";
vec.push_back (1);
for (int i = 0; i < sum; i++)
mult();
out();
}
}
8. 階乘位數 (Zerojudge_f358練習題)
題目:輸入 $n$,求 $n!\times (n-1)!\times ...\times 1!$ 的位數。
解法:將 $(n-i+1)\times log(i)$ 加起來,最後加一。
#pragma GCC optimize("O3")
#include <iostream>
#include <cmath>
using namespace std;
int main() {
ios::sync_with_stdio (false);
cin.tie (0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
double sum = 0;
for (int i = 1; i <= n; i++) {
sum += (n - i + 1) * log10 (i);
}
cout << (long long) sum + 1 << '\n';
}
}
9. Morty的函數 (Zerojudge_f369)
題目:輸入 $n$ 次函數 $f(x)$ 的 $n+1$ 個值,輸出 $f(k)/100$。
解法:拉格朗日插值法。
#pragma GCC optimize("O3")
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio (false);
cin.tie (0);
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
long long x[n + 1], y[n + 1], k;
double ans = 0;
for (int i = 0; i <= n; i++)
cin >> x[i];
for (int i = 0; i <= n; i++)
cin >> y[i];
cin >> k;
for (int i = 0; i <= n; i++) {
long long up = y[i], down = 1;
for (int j = 0; j <= n; j++)
if (i != j)
up *= k - x[j], down *= x[i] - x[j];
ans += (double) up / down;
}
cout << (long long) ans / 100 << '\n';
}
}
10. Caido的彈性碰撞 (Zerojudge_f361)
題目:兩顆球的質量、碰撞前的角度、速度,求碰撞後的角度、速度。
解法:彈性碰撞,動量守恆、力學能守恆,在二維可以拆成水平跟垂直分量,最後再加起來。
#pragma GCC optimize("O3")
#include <iostream>
#include <cmath>
#include <iomanip>
#define LD long double
using namespace std;
const LD pi = acos (-1);
void solve() {
LD m1, v1, o1, m2, v2, o2;
cin >> m1 >> v1 >> o1 >> m2 >> v2 >> o2;
o1 = o1 * pi / 180, o2 = o2 * pi / 180;
LD v1s, v1l, v2s, v2l, V1s, V1l, V2s, V2l;
v1s = v1 * sin (o1), v1l = v1 * cos (o1);
v2s = v2 * sin (o2), v2l = v2 * cos (o2);
V1s = (v1s * (m1 - m2) + 2 * m2 * v2s) / (m1 + m2);
V1l = (v1l * (m1 - m2) + 2 * m2 * v2l) / (m1 + m2);
V2s = (v2s * (m2 - m1) + 2 * m1 * v1s) / (m1 + m2);
V2l = (v2l * (m2 - m1) + 2 * m1 * v1l) / (m1 + m2);
v1 = sqrt (V1s * V1s + V1l * V1l), o1 = atan2 (V1s, V1l) * 180 / pi;
v2 = sqrt (V2s * V2s + V2l * V2l), o2 = atan2 (V2s, V2l) * 180 / pi;
if (o1 < -1e-5)
o1 += 360;
else if (-1e-5 < o1 && o1 < 1e-5)
o1 = 0;
if (o2 < -1e-5)
o2 += 360;
else if (-1e-5 < o1 && o1 < 1e-5)
o2 = 0;
cout << fixed << setprecision (2) << v1 << ' ' << o1 << ' ' << v2 << ' ' << o2 << '\n';
}
int main() {
ios::sync_with_stdio (false), cin.tie (0);
int t;
cin >> t;
while (t--)
solve();
}
11. 肯尼的階乘位數 (Zerojudge_f145)
題目:輸入 $n$,$f(n)=n!\times (n-1)!\times ...\times 1!$,求 $f(n)\times f(n-1)\times ...\times f(1)$ 的位數。
解法:將 $(n-i+1)\times (n-i+2)/2\times log(i)$ 加起來,最後加一。
#pragma GCC optimize("O3")
#include <iostream>
#include <cmath>
using namespace std;
int main() {
ios::sync_with_stdio (false);
cin.tie (0);
int t;
cin >> t;
while (t--) {
long long n;
cin >> n;
double sum = 0;
for (long long i = 1; i <= n; i++)
sum += (n - i + 1) * (n - i + 2) / 2 * log10 (i);
cout << (long long) sum + 1 << '\n';
}
}
離場 (Zerojudge_f033不公開)
題目:現在參加第 $n$ 年的跨年晚會,輸出今年是平年還是閏年。
解法:很多人都被騙到了,現在是 $n-1$ 年才要去參加 $n$ 年的跨年晚會。
#include <iostream>
using namespace std;
int main() {
int n;
while (cin >> n) {
n--;
if (n % 400 == 0 || (n % 100 != 0 && n % 4 == 0))
cout << "leap\n";
else
cout << "pin\n";
}
}
我的分享就到這裡結束了,如果喜歡我的 $\text{Blog}$,歡迎追蹤!
留言
張貼留言