zoukankan      html  css  js  c++  java
  • HDU 4020 Ads Proposal

    HDU_4020

    思路还是比较好想的,进行排序再统计即可,但是不同的处理方式之间存在着时间的差距。

    我后来选择的方式是,先将所有数据的标号r[i]依点击次数进行排序,然后初始化一个数组hash[]=0hash[i]表示依次遍历时customer i出现的次数,用一个数组ans[i]来记录每个customer点击率排行第i的广告的总的长度,即在遍历的时候令ans[++hash[r[i]]]+=click[r[i]]即可。

    最后再用一个数组res[i]来表示每个customer点击率在第i位及之前的所有广告的总长度。

    #include<stdio.h>
    #include
    <string.h>
    #include
    <stdlib.h>
    int N,M,Q,U,C,L;
    int name[500110],r[500110],q;
    double click[500010],len[500110];
    double ans[500110],res[500110];
    int hash[100110];
    int cmp(const void *_p,const void *_q)
    {
    int *a=(int *)_p;
    int *b=(int *)_q;
    return click[*a]>click[*b]?-1:1;
    }
    int main()
    {
    int i,j,k,n,t,tt,cur;
    scanf(
    "%d",&t);
    for(tt=0;tt<t;tt++)
    {
    scanf(
    "%d%d%d",&N,&M,&Q);
    for(i=0;i<M;i++)
    {
    scanf(
    "%d%lf%lf",&name[i],&click[i],&len[i]);
    r[i]
    =i;
    }
    qsort(r,M,
    sizeof(r[0]),cmp);
    for(i=1;i<=N;i++)
    hash[i]
    =0;
    for(i=1;i<=M;i++)
    ans[i]
    =0.0;
    for(i=0;i<M;i++)
    {
    hash[name[r[i]]]
    ++;
    ans[hash[name[r[i]]]]
    +=len[r[i]];
    }
    res[
    0]=0;
    for(i=1;i<=M;i++)
    {
    res[i]
    =ans[i]+res[i-1];
    }
    printf(
    "Case #%d:\n",tt+1);
    for(i=0;i<Q;i++)
    {
    scanf(
    "%d",&q);
    if(q>M)
    printf(
    "%.0f\n",res[M]);
    else
    printf(
    "%.0f\n",res[q]);
    }
    }
    return 0;
    }

      

  • 相关阅读:
    生产者-消费者模式
    Java中数字操作
    Java中的装箱拆箱
    Java中的匿名类
    JAVA中抽象类的一些总结
    JAVA继承时this和super关键字
    elasticsearch查询
    elasticsearch的映射
    kibana——es的批量操作
    kibana简单使用——elaticsearch的文档,索引的CRUD操作
  • 原文地址:https://www.cnblogs.com/staginner/p/2170377.html
Copyright © 2011-2022 走看看