zoukankan      html  css  js  c++  java
  • HDU 4399 Colorful Points [构造]

      一个序列长度为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 <stdio.h>
     2 #include <math.h>
     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 }
  • 相关阅读:
    python异常触发及自定义异常类
    python for i in range(x)应用的问题
    季羡林 暮年沉思录
    再谈python的list类型参数及复制
    Python 列表推导式
    JavaScript:垃圾数据是如何自动回收的?
    JavaScript:this的用法
    JavaScript:浅谈闭包及其回收原则
    ES6:async / await ---使用同步方式写异步代码
    五大主流浏览器与四大浏览器内核
  • 原文地址:https://www.cnblogs.com/swm8023/p/2701577.html
Copyright © 2011-2022 走看看