传送门::https://ac.nowcoder.com/acm/contest/2720/G
题意::构造一个字符串 (串长 <=1e9 ) 当且仅包含 n个 “ AHUICPC ” 子序列 且字符串长度 <=1e5
思路::
当你在串 ("UICPC")最前面 每添加1个”AH“,总共会构成 ( i +1 ) * i / 2 个子序列 ,这样就是可以构造最优解,使串尽量最短 ;
当然为啥是构造长度为2的最优了,同样的道理 当构造长度为3 的时候,虽然可以构造出那麽多子序列,但是长度会炸;
举个例子 “AHAHAHAH UICPC” 你会发现 子序列下总和 4 + 3 + 2 +1 =10 (等差求和)
因此我们首先要找出最大的 i 满足 ( i + 1 ) * i /2 < n ,然后对于多出的部分 k 我们是不是可以 找到一个位置(也就是构造的第 k 个“AH”位置前加上一个“A”) 满足 用它为起始位置刚好构造出 k 个子序列,显然只花费了 一个 单位长度
1 #include<bits/stdc++.h> 2 #define ll long long 3 using namespace std; 4 5 int main() 6 { 7 int n; 8 scanf("%d",&n); 9 if(n==1){ 10 printf("AHUICPC");return 0; 11 } 12 int k; 13 for(int i=1;;i++){ 14 if((ll)(i+1)*i/2<(ll)n){ 15 k=i; 16 } 17 else{ 18 break; 19 } 20 } 21 int t=(n-(k+1)*k/2); 22 for(int i=1;i<=t;i++){ 23 if(i==t-k+1){ 24 printf("AAH"); 25 } 26 else{ 27 printf("AH"); 28 } 29 } 30 printf("UICPC"); 31 return 0; 32 }
不足之处请指出!!!