zoukankan      html  css  js  c++  java
  • [noip2016d2t2]蚯蚓

    ·碰到这种题,一定要好好打暴力

    题面比较长,但只要细心看下去就可以找到突破口

    直接模拟或者写堆都可以拿到部分分

    http://www.cnblogs.com/ljh2000-jump/p/6184271.html

    正解的关键在于看出结论:把每次切掉的蚯蚓产生的两部分长度分别存入队尾,两个队列单调不上升

    于是开三个队列,每次判断队头即可

    还有比较麻烦的一点在于长度随时间的增加,用了一些小技巧去计算

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<cmath>
     5 using namespace std;
     6 const int inf=2147483647;
     7 const int maxn=7100500;//数组长度<=n+m 
     8 int u,v,n,m,q,time;
     9 struct data{
    10     int num,t;
    11 }L[4][maxn];
    12 int h[5],e[5];
    13 bool cmp(data x,data y){
    14     return x.num>y.num;
    15 } 
    16 int read(){
    17     int x=0,f=1;
    18     char ch=getchar();
    19     while (ch<'0'||ch>'9'){
    20         if (ch=='-') f=-1;
    21         ch=getchar();
    22     }
    23     while (ch>='0'&&ch<='9'){
    24         x=x*10+ch-'0';
    25         ch=getchar();
    26     } 
    27     return x*f;
    28 }
    29 int get(int i,int x){//第i个队列队首在时间x的长度 
    30     if (h[i]>e[i]) return -inf;
    31     return L[i][h[i]].num+q*(x-L[i][h[i]].t-1);
    32 }
    33 int compare(int x){//时间x,对比三个队头 
    34     int pos=1;
    35     for (int i=1;i<=3;i++){
    36         if(h[i]<=e[i])
    37           if (get(i,x)>get(pos,x)) pos=i; 
    38     }
    39     return pos;
    40 } 
    41 int main(){
    42     n=read(),m=read(),q=read();
    43     u=read(),v=read(),time=read();
    44     memset(L,0,sizeof(L));    
    45     for (int i=1;i<=n;i++)
    46       L[1][i].num=read();
    47     sort(L[1]+1,L[1]+1+n,cmp);
    48     h[1]=h[2]=h[3]=1;
    49     e[1]=n;e[2]=e[3]=0;
    50     for (int i=1;i<=m;i++){
    51         int pos=compare(i),len=get(pos,i);
    52         if (i%time==0) {
    53             if (i==time) printf("%d",len);
    54             else printf(" %d",len);
    55         }
    56         h[pos]++;
    57         L[2][++e[2]].num=int(u*1.0/v*len);
    58         L[3][++e[3]].num=len-int(u*1.0/v*len);
    59         L[2][e[2]].t=i;
    60         L[3][e[3]].t=i;
    61     }
    62     printf("
    ");
    63     for (int i=1;i<=n+m;i++){
    64         int pos=compare(m+1),len=get(pos,m+1);
    65         if (i%time==0) {
    66             if (i==time) printf("%d",len);
    67             else printf(" %d",len);
    68         }
    69         h[pos]++;
    70     }
    71     return 0;
    72 }
    View Code

    ==暴力真的很重要!!

  • 相关阅读:
    怎样写贪吃蛇小游戏?用100行python代码轻松解决!
    面试必问的celery,你了解多少?
    您的机器学习环保吗?一只AI训练排出180吨二氧化碳
    NLP技术应用到音乐领域,分分钟让你变成音乐大师!
    数据可视化“升级”修炼宝典
    一文掌握Python可视化库的两大王者
    多线程-模拟阻塞queue队列
    设计模式-单例模式
    多线程之wait,notify,volatile,synchronized,sleep
    spring与quartz整合
  • 原文地址:https://www.cnblogs.com/vincent-hwh/p/7701425.html
Copyright © 2011-2022 走看看