2022年6月14日 星期二

h033: 雜訊移除 (Noise)

程式碼

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

int main()
{
	string s;
	int n;
	cin >> s >> n;
	int i = 0;
	while (i != s.size())
	{
		if (s[i] - '0' == n)
		{
			s.erase(i, 1);
		}
		else
			i++;
	}
	bool flag = true;
	for (int i = 0; i < s.size() / 2; i++)
	{
		if (s[i] != s[s.size() - i - 1])
		{
			flag = false;
			break;
		}
	}
	if (flag) cout << "Yes";
	else cout << "No";
	return 0;
}

2022年6月13日 星期一

h081: 1. 程式交易

解題心得

題目中的利潤跟我認知的不一樣,整題花在理解題意上面的時間最久。

程式碼

#include<iostream>
using namespace std;

int main()
{
	int n, d, a[101] = { 0 }, sum = 0, current = -1;
	bool flag = false;
	cin >> n >> d;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
		if (i == 0)
		{
			current = a[i];
			flag = true;
		}
		else if (flag && a[i] >= current + d)
		{
			sum += a[i] - current;
			current = a[i];
			flag = false;
		}
		else if (!flag && a[i] <= current - d) // 當下沒有持有股票
		{
			current = a[i];
			flag = true;
		}
	}
	cout << sum;
	return 0;
}

g796: 檔案分類 (Files)

程式碼

#include<iostream>
using namespace std;

int main()
{
	int n, file[100] = { 0 }, index = 0;
	string s;
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		cin >> s;
		index = (s[3] - '0') * 10 + (s[4] - '0');
		file[index] ++ ;
	}
	for (int i = 0; i < 100; i++)
	{
		if (file[i])
		{
			cout << i << " " << file[i] << endl;
		}
	}
	return 0;
}

i399: 1. 數字遊戲

程式碼

#include<iostream>
using namespace std;

int main()
{
	int index[10] = { 0 }, maxTime = 0, n;
	for (int i = 0; i < 3; i++)
	{
		cin >> n;
		index[n]++;
	}
	for (int i = 0; i < 10; i++)
	{
		if (index[i] > maxTime)
			maxTime = index[i];
	}
	cout << maxTime << " ";
	for (int i = 9; i >= 0; i--)
	{
		if (index[i])
		{
			cout << i;
			maxTime--;
			if (3 - maxTime != 0) cout << " ";
		}
	}
	return 0;
}

i071: 風景 (Landscape)

解題心得

往左看一次,往右也看一次。

程式碼

#include<iostream>
using namespace std;

int main()
{
	int n, m, arr[1001], sum = 0, height;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	m -= 1;
	height = arr[m];
	for (int i = m - 1; i >= 0; i--)
	{
		if (arr[i] > height)
		{
			height = arr[i];
			sum++;
		}
	}
	height = arr[m];
	for (int i = m + 1; i < n; i++)
	{
		if (arr[i] > height)
		{
			height = arr[i];
			sum++;
		}
	}
	cout << sum;
	return 0;
}

2022年6月12日 星期日

h659: 計程車 (Taxi)

解題心得

想了一下才想到如何判斷區間QQ

程式碼

#include<iostream>
using namespace std;

int main()
{
	int k, w, s, e, sum = 0;
	cin >> k >> w >> s >> e;

	if (k < 2)
		sum += 20;
	else
		sum += 20 + (k - 2) * 5;
	sum += (w / 2) * 5;
	bool time[24] = { false };
	for (int i = s; i <= e; i++)
		time[i] = true;

	if (time[18] && time[19]) sum += 185;
	if (time[19] && time[20]) sum += 195;
	if (time[20] && time[21]) sum += 205;
	if (time[21] && time[22]) sum += 215;
	if (time[22] && time[23]) sum += 225;
	cout << sum;
	return 0;
}

h658: 捕魚 (Fishing)

程式碼

#include<iostream>
using namespace std;

int main()
{
	int x, y, n, fishX[501] = { 0 }, fishY[501] = { 0 }, ansX = 0, ansY = 0;
	cin >> x >> y >> n;
	
	for (int i = 0; i < n; i++)
	{
		cin >> fishX[i] >> fishY[i];
		int now = abs(x - fishX[i]) * abs(x - fishX[i]) + abs(y - fishY[i]) * abs(y - fishY[i]);
		int best = abs(x - fishX[ansX]) * abs(x - fishX[ansX]) + abs(y - fishY[ansY]) * abs(y - fishY[ansY]);
		if (now < best)
		{
			ansX = i;
			ansY = i;
		}
	}
	cout << fishX[ansX] << " " << fishY[ansY];
	return 0;
}

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;
}