A. Equidistant Letters
题意:
给一个字符串 ,最多出现两个相同的字母。 保证出现相同字母的相隔距离是一样的。
思路:
出现相同字母连续输出即可。
我的代码:
inline void solve()
{
string s;
cin >> s;
map<char, int> m;
int len = s.length();
for (int i = 0; i < len; i++)
{
m[s[i]]++;
}
for (auto i = m.begin(); i != m.end(); i++)
{
if (i->second > 1)
cout << i->first << i->first;
else
cout << i->first;
}
cout << endl;
}
大佬代码:
void solve(){
scanf("%s",a+1),n=strlen(a+1);
sort(a+1,a+n+1);
rep(i,1,n)putchar(a[i]);
puts("");
}
总结:忘记直接排序就可以起到一样效果了,属实是舍近求远了。
B. Minor Reduction
题意:给你一个数字。你必须对它执行一次以下简化:取两个相邻的数字x并用不带前导零的总和替换它们(如果总和是0,则表示为单个0).
思路:两个数字合成一个 ,除非加起来超过10才能比以前更大。否则会更小。因此需要对上述两种情况进行分类讨论和操作即可。
inline void solve()
{
string s;
cin >> s;
bool flag = 0;
for (int i = s.size() - 2; ~i; i--)
{
if (s[i] - '0' + s[i + 1] - '0' >= 10)
{
int x = s[i] - '0' + s[i + 1] - '0';
s[i] = x / 10 + '0', s[i + 1] = x % 10 + '0';
cout << s << '\n';
flag = 1;
break;
}
}
if (!flag)
{
int x = s[0] - '0' + s[1] - '0';
s.erase(s.begin());
s[0] = x + '0';
cout << s << '\n';
}
}
C. Monsters And Spells
思路:模拟题,正解应该是暴搜,但我尝试用dp来做。但是下一道D题2100分而且还是暴搜我就不补了。
我的DP:
inline void solve()
{
int n;
cin >> n;
vector<int> v(n);
vector<int> w(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
}
for (int i = 0; i < n; i++)
{
cin >> w[i];
}
for (int i = n - 2; i >= 0; i--)
{
w[i] = max(w[i], w[i + 1] - v[i + 1] + v[i]);
}
for (int i = 1; i < n; i++)
{
if (v[i] - v[i - 1] < w[i])
{
w[i] = max(w[i], w[i - 1] + v[i] - v[i - 1]);
}
}
long long ans = 1LL * w[0] * (w[0] + 1) / 2;
for (int i = 1; i < n; i++)
{
if (v[i] - v[i - 1] + w[i - 1] == w[i])
{
ans += 1LL * (w[i]) * (w[i] + 1) / 2;
ans -= 1LL * (w[i - 1]) * (w[i - 1] + 1) / 2;
}
else
{
ans += 1LL * (w[i]) * (w[i] + 1) / 2;
}
}
cout << ans << endl;
}
大佬的dp:
scanf("%d", &n), ans = 0;
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%d", &b[i]);
for (int i = n - 1; i >= 1; i--)
b[i] = max(b[i], b[i + 1] - (a[i + 1] - a[i]));
int lst = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] - a[i - 1] >= b[i])
ans += 1ll * (1 + b[i]) * b[i] / 2, lst = b[i];
else
ans += 1ll * (lst + 1 + (lst + a[i] - a[i - 1])) * (a[i] - a[i - 1]) / 2ll, lst += a[i] - a[i - 1];
}
printf("%lld\n", ans);