博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
codeforces 848A - From Y to Y(构造)
阅读量:6871 次
发布时间:2019-06-26

本文共 1164 字,大约阅读时间需要 3 分钟。

原题链接:

 

题意:让我们构造一个字符串。这里有一种操作:取走这个字符串的若干部分,分成两部分,然后将这两部分的合并插回字符串中,进行过处理的字符串部分不能再次被单独取出,只能整体取出,直到无法操作后停止。每次这种操作后,消耗, f(s,c)是c字符在s字符串重复的次数。

让我们输出:若干次操作后最小值恰好为k的字符串,不用考虑字符的顺序。

 

思路:最好怎么简单怎么做。如果我们让字符串中只有一种字符,显然通过一个一个字符加到字符串的方法可以得到最小值(n-1)*n/2,n是构造出的字符串长度。那么,如果字符串有两种字符,我们可以先构造出两段不同字符的字符串,然后合并,由于合并时没有公共的字符,合并不会使结果变化,此时的最小值为两个n*(n-1)/2相加,以此类推到26种字符的情况。

经过一些例子的检验,发现这种方法是对的。

构造结束后似乎不太可能完全用上26个字母,那么先在答案加上单个字符,防止0的特殊情况。

 

AC代码:

1 #include
2 #include
3 #include
4 using namespace std; 5 char ch[27]; 6 int val[5000],t; 7 int res[5000]; 8 void init() 9 {10 val[1]=0;11 int i;12 for(i=0;i<26;i++) ch[i]=(char)(i+'a');13 for(i=2;val[i-1]<=100000;i++){14 val[i]=val[i-1]+i-1;15 }16 t=i;17 return ;18 }19 int main()20 {21 int n;22 init();23 //cout<
<
>n){25 memset(res, 0, sizeof(res));26 int num=0;27 res[num++]=1;28 for(int i=t-1;i>0;i--){29 if(n==0) break;30 while(n>=val[i]){31 //cout<<'*'<

 

转载于:https://www.cnblogs.com/MasterSpark/p/7468398.html

你可能感兴趣的文章
java正则表达式实战例子,持续更新,记下来后面就不用重新写了。。。
查看>>
【玩转Golang】reflect.DeepEqual
查看>>
ssh免密码登录
查看>>
python ----Linux上安装scrapy
查看>>
Eclipse配置maven环境
查看>>
第五周PSP作业
查看>>
[转]Android 解析内存泄漏
查看>>
计算机组成原理(二)——计算机的基本组成
查看>>
Bellman-Ford&&SPFA
查看>>
Python轻量Web框架Flask使用
查看>>
用Supervisord管理Python进程
查看>>
zw版【转发·台湾nvp系列Delphi例程】HALCON DirectShow (Delphi Prism)
查看>>
P2330 05四川 繁忙的都市
查看>>
Android开发工具--adb的使用
查看>>
输入框的阴影去除,两种方法!
查看>>
threading模块
查看>>
tcp socket的发送与接收缓冲区(转)
查看>>
session简单存储的购物车系统
查看>>
【noi 2.6_8786】方格取数(DP)
查看>>
SCSS笔记
查看>>