• 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单例之enum实现方式
    spring之ControllerAdvice注解
    memcached命令
    2016年开源巨献:来自百度的71款开源项目
    dubbo通信协议之对比
    Elasticsearch权威指南(中文版)
    Apache shiro之权限校验流程
    简单的freemarker解析测试
    Apache shiro之身份验证(登陆)流程
  • 原文地址:https://www.cnblogs.com/staginner/p/2170377.html
Copyright © 2020-2023  润新知