2023/2/11信心upup赛后总结

什么构造题,会都不会

之前确实没怎么做过构造题,这下遇到了是真的麻。
image
这题还挺水的。主要是把题看错了,然后挂了。

\(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;
	}
}

image
一眼,有这样一个方案:
image
中间绿色的方块都是满足周围四个方向都有方块的方块。假设有 \(n\) 个绿色的块,所有绿色加黑色的块就有 \(3n + 4\) 个。

能水 \(80pts\),但还有 \(n = 300\) 这样的点,方块的总数按照刚才的方案肯定是超了 \(900\) 的。不得不换个思路。
image

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

posted @ 2023-02-11 17:42  腾云今天首飞了吗  阅读(34)  评论(0)    收藏  举报