Codeforces Global Round 7筆記
感想
恥辱場。做出三道題,但每道題平均交了4遍還多,第一題沒有第一眼想出正確答案,Rating還是-60,心累。感覺還是要放平心態,求穩。並且多做思維題,思維還是過於僵化。
實時Rating:1304,不能再低了,再低真對不起我自己了。
題目
A Bad Ugly Numbers
解析
給定一個,要求一個位數,滿足:的每一位都不爲0,且s不能被組成它的每個數字整除。。
說實話我沒有先敲出來這個題。既然這麼大一定不能套數了。賽場上用計算器擺了好幾種關於和「7」有關的數,我也不知道爲什麼當時對7有如此的執念,明明小數點後面會循環,數長了之後總會能除開的……最後發現
的小數點後永遠是.5,於是提交通過。提交時由於太過急躁,第一次選錯了語言,後幾次試了錯誤的答案。這題答案不唯一,標解是用了
代碼
#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
解析
給定一個數組,由非負整數構成,給定數組,規定,給定數組。現已知數組,要求倒推出。
純模擬。沒啥技術含量。根據題目,,顯然可求,就是到取個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
解析
給定一個排列,再給定一個,使得可以被分成不相交的份,定義爲各份最大值的和,求的值和所有滿足的的方案數。
這題交了7遍,還是沒過。第一問求好辦,直接前大加起來即可。第二問的話,要選定一個分界線,分界線可以放在前k大的數字後面到下一個數字前。設兩個數字位置爲和,則方案數有個,然後乘起來就好。
代碼
#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;
}
}