2023/2/11信心upup赛后总结
什么构造题,会都不会
之前确实没怎么做过构造题,这下遇到了是真的麻。

这题还挺水的。主要是把题看错了,然后挂了。
对 \(iamhuman\) 这个串的每个字母,设 \(a[i]\) 为第 \(i\) 个字母在你的串中出现的次数,总方案即为
\(a[1] * a[2] * a[3]...* a[n]\),为使串尽可能短,就需要让 \(a[1]..a[n]\) 间的每个数尽可能相等。枚举这样一个值,再进行一些微调即可。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e5;
long long qpow(int a,int n){
int ret =1;
while(n){
if(n & 1)ret *= a;
n /= 2;
a = a* a;
}
return ret;
}
int k,a[MAXN + 5];
signed main(){
cin >> k;
string s = "iamhuman";
int cnt = 1;
while(1){
int m = qpow(cnt,8);
if(m >= k){
int mul = 1;
for(int i = 0; i < s.size(); i++){
mul *= cnt;
a[i] = cnt;
if(mul * qpow(cnt - 1,s.size() - i - 1) >= k){
break;
}
}
for(int i = 0; i < s.size(); i++){
a[i] = max(a[i],cnt - 1);
for(int j = 1; j <= a[i]; j++){
cout << s[i];
}
}
return 0;
}
++cnt;
}
}

一眼,有这样一个方案:

中间绿色的方块都是满足周围四个方向都有方块的方块。假设有 \(n\) 个绿色的块,所有绿色加黑色的块就有 \(3n + 4\) 个。
能水 \(80pts\),但还有 \(n = 300\) 这样的点,方块的总数按照刚才的方案肯定是超了 \(900\) 的。不得不换个思路。

显而易见的,这种构造方案的优于刚才的解。直接将红框部分反复输出并计数即可得到答案。

浙公网安备 33010602011771号