P6101 [EER2]出言不逊

题目描述:传送门
思路:
本题其实是一道数学题。
事实上,我们可以列出一个方程:
2 x × m a x n + ∣ S ∣ − 1 = l e n 2^x \times maxn + |S| - 1 = len 2x×maxn+S1=len ∣ S ∣ 就 是 字 符 串 S 的 长 度 , m a x n 为 出 现 次 数 |S|就是字符串S的长度,maxn为出现次数 SSmaxn 得 : 现 已 知 l e n , ∣ S ∣ , 求 x 得:现已知len, |S|, 求x len,S,x 将 方 程 变 形 得 : 将方程变形得: 2 x = l e n + 1 − ∣ S ∣ m a x n 2^x = \frac{len +1 - |S|}{maxn} 2x=maxnlen+1S x = l o g 2 l e n + 1 − ∣ S ∣ m a x n x = {log}_{2}^{\frac{len +1 - |S|}{maxn}} x=log2maxnlen+1S
于是,我们得出答案。

#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;

template < typename T > void read(T &x)
{
	int f = 1;x = 0;char c = getchar();
	for (;!isdigit(c);c = getchar()) if (c == '-') f = -f;
	for (; isdigit(c);c = getchar()) x = x * 10 + c - '0';
	x *= f;
}

int c[1005];

int main()
{
	//freopen(".in", "r", stdin);
	//freopen(".out", "w", stdout);
	string s;
	long double l;
	int maxn = INT_MIN;
	memset(c, 0, sizeof(c));
	cin >> s;
	cin >> l;
	int len = s.size();
	if(len >= l)
	{
		cout << 0 << endl;
		return 0;
	}
	for(int i = 0;i < len;i++)
	{
		c[int(s[i])]++;
		maxn = max(maxn, c[int(s[i])]);
	}
	if(l - maxn <= len)
	{
		cout << 1 << endl;
		return 0;
	}
	l -= double(len);
	long double t = double(maxn);
	l /= t;
	l += 1;
	double ans = log(l) / log(2);
	if(ans == floor(ans)) cout << ans << endl;
	else cout << ceil(ans) << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值