Codeforces Global Round 7筆記

Codeforces Global Round 7筆記

感想

恥辱場。做出三道題,但每道題平均交了4遍還多,第一題沒有第一眼想出正確答案,Rating還是-60,心累。感覺還是要放平心態,求穩。並且多做思維題,思維還是過於僵化。

實時Rating:1304,不能再低了,再低真對不起我自己了。

題目

A Bad Ugly Numbers

解析

給定一個nn,要求一個nn位數ss,滿足:ss的每一位都不爲0,且s不能被組成它的每個數字整除。n105n \le 10^5

說實話我沒有先敲出來這個題。既然nn這麼大一定不能套數了。賽場上用計算器擺了好幾種關於和「7」有關的數,我也不知道爲什麼當時對7有如此的執念,明明小數點後面會循環,數長了之後總會能除開的……最後發現

777774\overline{77777\dots4}

的小數點後永遠是.5,於是提交通過。提交時由於太過急躁,第一次選錯了語言,後幾次試了錯誤的答案。這題答案不唯一,標解是用了

233333\overline{23333\dots3}

代碼

#include <bits/stdc++.h>

typedef long long ll;

ll nextInt()
{
	ll num = 0;
	char c = 0;
	bool flag = false;
	while ((c = std::getchar()) == ' ' || c == '\r' || c == '\t' || c == '\n');
	if (c == '-')
		flag = true;
	else
		num = c - 48;
	while (std::isdigit(c = std::getchar()))
		num = num * 10 + c - 48;
	return (flag ? -1 : 1) * num;
}

const size_t _Siz = 103020;

int T;

int main(int argc, char **argv)
{
	T = nextInt();
	while (T--)
	{
		int n = nextInt();
		if (n == 1)
		{
			std::cout << -1 << std::endl;
			continue;
		}
		for (int i = 1; i <= n - 1; i++)
			std::cout << 7;
		std::cout << 4 << std::endl;
	}
	return 0;
}

B Maximums

解析

給定一個數組aa,由非負整數構成,給定數組xx,規定xi=max(a1,a2,,ai1)x_i = max(a_1, a_2, \dots, a_{i - 1}),給定數組bi=aixib_i = a_i - x_i。現已知數組bb,要求倒推出aa

純模擬。沒啥技術含量。根據題目,ai=bi+xia_i = b_i + x_i,顯然xix_i可求,就是b1b_1bi1b_i - 1取個max。然後加起來就完事。

這題交了好幾遍,就是因爲沒有讀好題,把題目想得過於簡單。

代碼

#include <bits/stdc++.h>

#define debug(X) std::cout << #X << " : " << X << std::endl

typedef long long ll;

ll nextInt()
{
	ll num = 0;
	char c = 0;
	bool flag = false;
	while ((c = std::getchar()) == ' ' || c == '\r' || c == '\t' || c == '\n');
	if (c == '-')
		flag = true;
	else
		num = c - 48;
	while (std::isdigit(c = std::getchar()))
		num = num * 10 + c - 48;
	return (flag ? -1 : 1) * num;
}

const size_t _Siz = 503020;

ll T, b[_Siz] = { 0 }, t[_Siz] = { 0 };

int main(int argc, char **argv)
{
	int n = nextInt();
	ll Mx = 0;
	bool flag = false;
	for (int i = 1; i <= n; i++)
	{
		b[i] = nextInt();
		t[i] = (t[i - 1] + b[i] > t[i - 1]) ? (t[i - 1] + b[i]) : t[i - 1];
	}
	std::cout << b[1] << ' ';
	for (int i = 2; i <= n; i++)
		std::cout << t[i - 1] + b[i] << ' ';
	std::cout << std::endl;
}

C Permutation Partitions

解析

給定一個排列pp,再給定一個kk,使得pp可以被分成不相交的kk份,定義valuevalue爲各份最大值的和,求valuevalue的值和所有滿足的valuevalue的方案數。

這題交了7遍,還是沒過。第一問求valuevalue好辦,直接前kk大加起來即可。第二問的話,要選定一個分界線,分界線可以放在前k大的數字後面到下一個數字前。設兩個數字位置爲posipos_iposi+1pos_{i + 1},則方案數有posi+1posipos_{i + 1} - pos_i個,然後乘起來就好。

代碼

#include <bits/stdc++.h>

#define debug(X) std::cout << #X << " : " << X << std::endl

typedef long long ll;

const ll mod = 998244353ll;

ll nextInt()
{
	ll num = 0;
	char c = 0;
	bool flag = false;
	while ((c = std::getchar()) == ' ' || c == '\r' || c == '\t' || c == '\n');
	if (c == '-')
		flag = true;
	else
		num = c - 48;
	while (std::isdigit(c = std::getchar()))
		num = num * 10 + c - 48;
	return (flag ? -1 : 1) * num;
}

int main(int argc, char **argv)
{
	int n, k, p = -1, ans = 1, sum = 0;
	n = nextInt(), k = nextInt();
    for (int i = 1; i <= n; i++)
	{
    	int x = nextInt();
        if (x >= (n - k + 1))
		{
            sum += x;
            if (p != -1)
                ans = ans * (i - p) % mod;
            p = i;
        }
    }
	std::cout << sum << ' ' << ans << std::endl;
	return 0;
}

D Prefix-Suffix Palindrome

解析

給定一個字符串,要求它裏面的迴文子串,滿足:該字串由兩段組成,前段是原串的前綴,後段是原串的後綴。

純模擬,蠻練手的這個題。確定下思路之後往下寫就好了。Hard version沒測,目測應該也能過。

代碼

#include <bits/stdc++.h>

#define debug(X) std::cout << #X << " : " << X << std::endl

typedef long long ll;

ll nextInt()
{
	ll num = 0;
	char c = 0;
	bool flag = false;
	while ((c = std::getchar()) == ' ' || c == '\r' || c == '\t' || c == '\n');
	if (c == '-')
		flag = true;
	else
		num = c - 48;
	while (std::isdigit(c = std::getchar()))
		num = num * 10 + c - 48;
	return (flag ? -1 : 1) * num;
}

const size_t _Siz = 503020;

ll T;
		
std::string st;

bool palin(std::string stx, int l, int r)
{
	std::string st2 = stx.substr(l, r - l + 1);
	std::string st1 = st2;
	std::reverse(st1.begin(), st1.end());
	return (st1 == st2);
}


int main(int argc, char **argv)
{
	T = nextInt();
	while (T--)
	{
		std::cin >> st;
		int len = st.length();
		if (len == 1)
		{
			std::cout << st << std::endl;
			continue;
		}
		if (len == 2)
		{
			if (st[0] == st[1])
				std::cout << st << std::endl;
			else
				std::cout << st[0] << std::endl;
			continue;
		}
		std::string ans, anst;
		int head = 0, tail = len - 1;
		while (head != tail && head != tail - 1)
		{
			if (st[head] == st[tail])
				ans += st[head];
			head++;
			tail--;
		}
		if (head == 1 && tail == len - 2)
		{
			head = 0, tail = 1;
			int t1 = 0, t2 = 0;
			while (palin(st, 0, tail++)) t1++;
			head = len - 2, tail = len - 1;
			while (palin(st, head--, len - 1)) t2++;
			if (t1 >= t2)
				std::cout << st.substr(0, t1) << std::endl;
			else
				std::cout << st.substr(len - t2, len - 1) << std::endl;
			continue;
		}
		int p = head, q = tail, r = 0, s = 0;
		for (q = tail; q > p; q--)
			if (palin(st, p, q))
			{
				r = q;
				anst += st.substr(p, q - p + 1);
				break;
			}
		for (p = r + 1; p < tail; p++)
			if (palin(st, p, tail))
			{
				anst += st.substr(p, tail - p + 1);
				break;
			}
		std::string tans = ans;
		std::reverse(tans.begin(), tans.end());
		std::cout << ans + anst + tans << std::endl;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章