这是一道纯暴力能解决的问题,而且是一道填空题,只需判断每个日期中有无这样的数即可。
代码如下:
#include
using namespace std;
int a[110] = {0, 5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7, 5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9, 2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3, 8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6, 1, 4, 0, 1, 0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3};
int month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int day[10] = {0, 2, 0, 2, 3};
int ans;
int main(){
for (int i = 1; i <= 12; i++)
{
for (int j = 1; j <= month[i]; j++)
{
day[5] = i / 10;
day[6] = i % 10;
day[7] = j / 10;
day[8] = j % 10;
int k = 1;
for (int t = 1; t <= 100; t++)
{
if (a[t] == day[k]) k++;
if (k == 9)
{
ans++;
break;
}
}
}
}
cout << ans << endl;
return 0;
}
答案为:235
这个题是一个填空题,而且题目给了一个前提为0出现的次数比1少,这个很关键,代表着这个函数为单调递增状态的,而且这个H(S)推算也不难
然后可以从1遍历到长度的一半来求解,也可以根据二分来求解,我就附一个二分的代码了
#include
#include
using namespace std;
double res = 11625907.5798;
double len = 23333333;
bool check(double mid)
{
double t = -mid * mid / len * log2(mid / len) - (len - mid) * (len - mid) / len * log2((len - mid) / len);
if (t - res <= 1e-4) return 1;
else return 0;
}
int main(){
int l = 1, r = len / 2;
while (l < r)
{
int mid = l + r + 1>> 1;
if (check(double(mid))) l = mid;
else r = mid - 1;
}
cout << l << endl;
return 0;
}
答案为:11027421
假设需要k个原材料才可以生产出一个产物,就是说需要k个O才能得到一个X
如果k太大了,就会导致不够,k太小的就会导致生产变多,所以要对于一个炉子来说,可能的情况就是往这两个的极限逼近
先解释maxx,k最多为a/b,如果k再大了就不够了,然后对每一个炉子的最大值取min
再解释minn,如果k太小的话,就会生产出b+1个,所以就算一下产出b+1个时的k值,然后对这个值+1使得他不足以生成b+1个,又是逼近b+1个。
所以,maxx = min(maxx, a / b), minn = max(minn, a / (b+1) + 1), 代码如下:
#include
using namespace std;
int minn, maxx;
int main(){
int n;
cin >> n;
int a, b;
cin >> a >> b;
minn = a / (b + 1) + 1;
maxx = a / b;
for (int i = 2; i <= n; i++)
{