2022年6月12日 星期日

f679: 公會成員

解題心得

原本left<=right沒有加等號,加上後就過了。

程式碼

#include<iostream>
#include<vector>
using namespace std;

int main()
{
	long long int n, q, x, t;
	vector<long long int> v;

	cin >> n >> q;
	for (int i = 0; i < n; i++)
	{
		cin >> x;
		v.push_back(x);
	}
	while (q--)
	{
		cin >> t;
		int left = 0, right = v.size() - 1, mid = (left + right) / 2;
		bool flag = false;
		while (left <= right)
		{
			if (v[mid] == t)
			{
				flag = true;
				break;
			}
			else if (v[mid] < t)
			{
				left = mid + 1;
			}
			else
			{
				right = mid - 1;
			}
			mid = (left + right) / 2;
		}
		if (flag) cout << "Yes" << endl;
		else cout << "No" << endl;
	}
	
	return 0;
}

2022年6月11日 星期六

f327: 刪除欄位

解題心得

這題有點像。

程式碼

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	string s1, s2;
	int base = 0, col1 = 0, col2 = 0;
	cin >> s1 >> s2;
	for (int i = s1.size() - 1; i >= 0; i--)
	{
		col1 += (s1[i] - 'A' + 1) * pow(26, base);
		base++;
	}
	base = 0;
	for (int i = s2.size() - 1; i >= 0; i--)
	{
		col2 += (s2[i] - 'A' + 1) * pow(26, base);
		base++;
	}
	cout << abs(col1 - col2) + 1;
	return 0;
}

f291: 試算表大小

解題心得

AAA3 = AAA(col) * 3(row)

AAA = A * 26^2 + A * 26^1 + A

程式碼

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
	string s;
	int col = 0, row = 0, base = 1;
	cin >> s;
	while (isdigit(s.back()))
	{
		row += base * (s.back() - '0');
		s.pop_back();
		base *= 10;
	}
	base = 0;
	for (int i = s.size() - 1; i >= 0; i--)
	{
		col += (s[i] - 'A' + 1) * pow(26, base);
		base++;
	}
	cout << col * row;
	return 0;
}

2022年6月10日 星期五

f418: Word Search Puzzle

程式碼

#include<iostream>
using namespace std;

int main()
{
	int h, w, r1, c1, r2, c2;
	cin >> h >> w >> r1 >> c1 >> r2 >> c2;
	r1 -= 1; c1 -= 1; r2 -= 1; c2 -= 1;
	char puzzle[20][50];
	for (int i = 0; i < h; i++)
		for (int j = 0; j < w; j++)
			cin >> puzzle[i][j];
	if (r1 == r2)
	{
		for (int i = c1; i <= c2; i++)
			cout << puzzle[r1][i];
	}
	else if (c1 == c2)
	{
		for (int i = r1; i <= r2; i++)
			cout << puzzle[i][c1];
	}
	else
	{
		for (int i = 0; i <= abs(r1 - r2); i++)
			cout << puzzle[r1 + i][c1 + i];
	}
	return 0;
}

f821: nAnB ( 正常版 )

程式碼

#include<iostream>
using namespace std;

int main()
{
	string ans, s;
	int m;
	cin >> ans >> m;
	while (m--)
	{
		cin >> s;
		int a = 0, b = 0;
		for (int i = 0; i < s.size(); i++)
		{
			for (int j = 0; j < s.size(); j++)
			{
				if (ans[i] == s[j])
				{
					if (i == j) a++;
					else b++;
				}
			}
		}
		cout << a << "A" << b << "B" << endl;
	}
	return 0;
}

f640: 函數運算式求值

解題心得

用stack,把字串倒著看。

程式碼

#include<iostream>
#include<stack>
#include<vector>
#include <string>
using namespace std;

int main()
{
	int x, y, z;
	stack<int> st;
	vector<string> v;
	string s;
	while (cin >> s)
		v.push_back(s);
	for (int i = v.size() - 1; i >= 0; i--)
	{
		if (v[i] == "f")
		{
			x = st.top(); st.pop();
			x = 2 * x - 3;
			st.push(x);
		}
		else if (v[i] == "g")
		{
			x = st.top(); st.pop();
			y = st.top(); st.pop();
			x = 2 * x + y - 7;
			st.push(x);
		}
		else if (v[i] == "h")
		{
			x = st.top(); st.pop();
			y = st.top(); st.pop();
			z = st.top(); st.pop();
			x = 3 * x - 2 * y + z;
			st.push(x);
		}
		else
		{
			st.push(stoi(v[i]));
		}
	}
	cout << st.top();
	return 0;
}

2022年6月9日 星期四

g308: pB. 跳跳布朗尼(Brownie)

程式碼

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	int n, t, brownie[1001] = { 0 }, info[1001] = { 0 }, sum = 0;
	bool isVisited[1001] = { false };

	cin >> n >> t;
	for (int i = 0; i < n; i++)
		cin >> info[i];
	for (int i = 0; i < n; i++)
		cin >> brownie[i];

	while (!isVisited[t])
	{
		sum += brownie[t];
		isVisited[t] = true;
		t = info[t];
	}
	cout << sum;
	return 0;
}

g307: pA. 為了好吃的蘋果派(Apple Pie)

解題心得

照著題目敘述即可。

程式碼

#include <iostream>
#include <algorithm>
using namespace std;

int main()
{
	int n, k, t, arr[1001] = { 0 };
	bool flag = false;

	cin >> n >> k >> t;
	for (int r = 0; r < n; r++)
	{
		for (int i = 0; i < k; i++)
			cin >> arr[i];
		sort(arr, arr + k);
		int sum = 0;
		for (int i = 1; i < k - 1; i++)
			sum += arr[i];
		if ((double)sum / (k - 2) >= t)
		{
			cout << r << endl;
			flag = true;
		}
	}
	if (!flag) cout << "A is for apple." << endl;
	return 0;
}

h660: 躲避球 (DodgeBall)

解題心得

照著題目說明做就好了。

程式碼

#include <iostream>
using namespace std;

int main()
{
	int x, r, v, n, p, s;
	cin >> x >> r >> v >> n;
	while (n--)
	{
		cin >> p >> s;
		if (x - r <= p && p <= x + r && v >= s)
			x = p;
		else if (x - r <= p && p <= x + r && v < s)
		{
			if (p < x) x += 15;
			else x -= 15;
		}
	}
	cout << x;
	return 0;
}

g488: COVID-101

解題心得

事先算好,直接輸出。

程式碼

#include <iostream>
using namespace std;

int main()
{
	long long int x[201] = { 0, 1 };
	for (int i = 2; i <= 200; i++)
	{
		x[i] = x[i - 1] + i * i - i + 1;
	}

	int n;
	cin >> n;
	cout << x[n];
	return 0;
}

i213: stack 練習

解題心得

就很基本的stack(?

程式碼

#include <iostream>
#include <stack>
using namespace std;

int main()
{
	int n, k, x;
	stack<int> st;
	
	cin >> n;
	while (n--)
	{
		cin >> k;
		if (k == 1)
		{
			cin >> x;
			st.push(x);
		}
		else if (k == 2)
		{
			if (st.empty()) cout << -1 << endl;
			else cout << st.top() << endl;
		}
		else if (k == 3)
		{
			if (!st.empty())
				st.pop();
		}
	}
	return 0;
}