博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 4399 Colorful Points [构造]
阅读量:7170 次
发布时间:2019-06-29

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

  一个序列长度为n的序列P(1,n),构造一个序列Q,长度为N并且由1~N组成。一开始Qn对在P1的位置,接下来每秒Q都会整体右移一个位置,直到2N秒后和P没有交集。Ai代表第i秒P和Q交集元素的个数,Bi代表位置重合并且元素相等的元素个数。令Ci=max(Ai-Bi),构造一个序列,使Ci最小。

  Ci最小是N-sqrt(N),官方题解说的比较详细。构造序列这个地方看了半天才看明白他是怎么构造的,对于S序列,可以这么理解:给出一个序列x[1,n],以及S(a1,a2,a3....),对应的操作就是先把x[1~a1]翻转,再把[a1+1,a1+a2+1]翻转....,比如x[]=(1,2,3,4,5,6,7),S[]=(1,2,3),那么操作完的序列就是x[]=(1, 3,2,  6,5,4,  7)。。而这题对应的S序列就是S[]=(1,2,3...D-1,1,2,3....D),D=N-sqrt(N)。其实这么构造也不难理解,两个顺序相反数字相同的序列,在相遇的第1,3,5。。7秒都会有且仅有1个位置相同并且数字相同的树。。想到这点差不多就明白这题为什么这样构造了。。

 

1 #include 
2 #include
3 int cas, n; 4 int main(){ 5 scanf("%d", &cas); 6 for (int ca = 1; ca <= cas; ca++) { 7 scanf("%d", &n); 8 int d = (int)sqrt(n + 0.5), p = 1; 9 printf("Case #%d: %d\n",ca, n - d);10 for (int i = 0; i < 2; i++)11 for (int j = 1; j < d + i; j++)12 for (int x = 1, k = p; x <= j; x++)printf("%d%c", k + j - x, p++==n ? '\n':' ');13 for (; p <= n; p++) printf("%d%c", p, p==n ? '\n':' ');14 }15 return 0;16 }

转载于:https://www.cnblogs.com/swm8023/archive/2012/09/25/2701577.html

你可能感兴趣的文章
进阶篇第五期:UIScrollView的那点事儿
查看>>
CSS系列:CSS中盒子模型
查看>>
2017网络安全产业研究报告学习笔记
查看>>
AES&FEC GPON中的加密与纠错
查看>>
python 字典嵌套
查看>>
Android系统名词解释汇总
查看>>
推荐开发工具系列之--PyF5(自动刷新)
查看>>
Nginx配置
查看>>
Josephus问题的不同实现方法与总结
查看>>
linux监控系统_Zabbix概念(2)
查看>>
JMM & synchronized概述
查看>>
路由器改交换机设置
查看>>
nagios系列(八)之nagios通过nsclient监控windows主机
查看>>
Eclipse SVN插件设置
查看>>
Java中private、protected、public和default的区别-001
查看>>
CCF NOI1123 A-B
查看>>
Ubuntu的默认root密码
查看>>
Vue+Element+Select获取选中的对象
查看>>
Ubuntu下Tomcat连接MySql数据库
查看>>
WPF Summary 系列指导(连载中…^_^)
查看>>