P6101 [EER2]出言不逊
看到大家都是暴力枚举,但是其实这道题有数学方法。
首先,很明显,第一次找到一个出现次数最大的字符后,每次都是加上这么多同样的字符,这样才能最快。
假设原串长度为 ,原串中出现次数最大的字符出现过了 次,按照题意,最后需要长度 。可以列出方程 ,则化简可得为 ,进一步,,带入即可:
#include <bits/stdc++.h>
using namespace std;
#define int __int128
int read()
{
int x = 0;
char ch = getchar();
while (ch >= '0' && ch <= '9')
{
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x;
}
void write(int x)
{
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
signed main()
{
string s;
int l, cnt = 0;
cin >> s;
scanf("\n");
l = read();
int now = s.length();
int len = s.length() - 1;
map<char, int> mp;
for (int i = 0; i <= len; i++)
{
mp[s[i]]++;
}
if (now >= l)
{
write(cnt);
puts("");
return 0;
}
cnt++;
int maxn = 0;
for (map<char, int>::iterator it = mp.begin(); it != mp.end(); ++it)
{
if (it->second > maxn)
{
maxn = it->second;
}
}
now += maxn;
int rem = l - now;
int q = ceil(rem * 1.0 / maxn);
q += 2;
int ans = ceil(log2(q * 1.0));
ans--;
cnt += ans;
write(cnt);
puts("");
return 0;
}

浙公网安备 33010602011771号