关闭

HDU 5701 中位数计数 (百度之星初赛)

287人阅读 评论(0) 收藏 举报
分类:

【题目链接】点击打开链接

【分析&解题思路】

首先对于第i个数,我们从i-1个数开始递减,分别与第i个数进行比较,假设比第i个数大的数的个数即为l,比第i个数小的数的个数即为r,dp[l-r=k]则为[比第i个数的数的个数][比第i个数的数的个数]多k个的区间个数,那要保证第i个数是区间内的中位数,我只需要在第i个数的右边找有多少个[比第i个数的数的个数][比第i个数的数的个数]多k个的区间,这样两个区间连接起来,正好[比第i个数的数的个数][比第i个数的数的个数]一样多,这样,第i个数就是此区间内的中位数

另外,因为数组下标必须为非负整数,故把数组的中心点移至8000,即dp[8000+k],这样就保证了下标一定是符合要求的

【AC代码】

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<math.h>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
typedef __int64 LL;
typedef unsigned __int64 LLU;
const int nn=110000;
const int inf=0x3fffffff;
const int mod=1000000007;
const LL inf64=(LL)inf*inf;
const double eps = 1e-12;
using namespace std;
int n;
int a[8100];
int ans[8100];
int tem[8100*2];
int main()
{
    int i,j;
    while(scanf("%d%",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            ans[i]=1;
        }
        for(i=1;i<=n;i++)
        {
            memset(tem,0,sizeof(tem));
            int ix=0;
            for(j=i-1;j>=1;j--)
            {
                if(a[j]<a[i])
                {
                    ix--;
                }
                else
                    ix++;
                tem[ix+8010]++;
                if(ix==0)
                    ans[i]++;
            }
            ix=0;
            for(j=i+1;j<=n;j++)
            {
                if(a[j]<a[i])
                    ix--;
                else
                    ix++;
                ans[i]+=tem[8010-ix];
                if(ix==0)
                    ans[i]++;
            }
        }
        for(i=1;i<=n;i++)
        {
            printf("%d%c",ans[i],i==n?'\n':' ');
        }
    }
    return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

HDU 5701 中位数计数( 2016"百度之星" - 初赛(Astar Round2B) 思维 + 暴力)

传送门 中位数计数Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Tota...
  • qingshui23
  • qingshui23
  • 2016-05-27 20:04
  • 3169

HDU 5701 中位数计数 (暴力 思维题)

HDU 5701 中位数计数 (暴力 思维题)
  • Tc_To_Top
  • Tc_To_Top
  • 2016-05-22 21:28
  • 1502

hdu 5713 K个联通块 2016百度之星复赛1002 DP

用dp[i][j] 表示 状态i分成k个联通块的方案数。状态i的二进制第j位代表编号为j的点。 f[i]表示状态i内删边,仍保持一个联通块的方案数。 则有 转移方程 dp[i][k] = sum(dp...
  • Techmonster
  • Techmonster
  • 2016-05-30 17:52
  • 1158

HDU 5701 中位数计数 百度之星初赛

中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S...
  • Dacc123
  • Dacc123
  • 2016-09-10 08:41
  • 262

hdu 5701 中位数计数(类似折半搜索)(16百度之星round2B)

Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Pr...
  • chat_c
  • chat_c
  • 2016-05-22 23:32
  • 515

hdu 5701 中位数计数(重构数组)

中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total S...
  • acm_cxq
  • acm_cxq
  • 2016-05-22 21:48
  • 529

HDU5701中位数计数(思维,暴力)

中位数计数 Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total S...
  • qq_33183401
  • qq_33183401
  • 2016-11-05 20:57
  • 219

HDU - 5701 中位数计数 (思维)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5701点击打开链接 中位数计数 Time Limit: 12000/6000 MS (Jav...
  • xuejye
  • xuejye
  • 2017-12-28 20:45
  • 24

HDU 5701 中位数计数(思维,区间)好题

Problem Description 中位数定义为所有值从小到大排序后排在正中间的那个数,如果值有偶数个,通常取最中间的两个数值的平均数作为中位数。现在有n个数,每个数都是独一无二的,求出每个数在...
  • zhao5502169
  • zhao5502169
  • 2017-11-10 14:52
  • 64

【HDU】5701 - 中位数计数(计数 & 思维)

51Nod题目链接:点击打开题目 HDU题目链接:点击打开题目 中位数计数 Time Limit: 12000/6000 MS (Java/Others)    Memory Limit...
  • wyg1997
  • wyg1997
  • 2016-08-16 16:01
  • 337
    个人资料
    • 访问:377455次
    • 积分:15881
    • 等级:
    • 排名:第784名
    • 原创:1254篇
    • 转载:13篇
    • 译文:0篇
    • 评论:61条
    文章分类