2017-9-3 校内模拟T2取数win

题意:给你一个序列,叫你找一个子序列,使得这个子序列的平均数减去中位数最大。

思路:题面直接说是单峰函数,我也没多想(根本没看懂),现在看来就是排序+三分搜索啦。

代码:(特地去学了下三分。。):

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
long long lefts,rights,lm,mr;
int num[200100],presum[200100];
double ansx,anss,ans,hh=-1;
double df(long long w,long long l){
    long long k=presum[w]-presum[w-l-1]+presum[n]-presum[n-l];
    return (double)k/(double)(2*l+1)-(double)num[w];
}
int main(){
    //freopen("win.in","r",stdin);
    //freopen("win.out","w",stdout);
    scanf("%d",&n);
    if(n<3){
        printf("0.00\n");
        return 0;
    }
    for (int i=1;i<=n;i++)
        scanf("%d",&num[i]);
    presum[0]=1;
    sort(num+1,num+n+1);
    for (int i=1;i<=n;i++)
        presum[i]=presum[i-1]+num[i];
    for (int i=1;i<=n;i++){
        lefts=0;
        rights=min(n-1,i-1);
        while(lefts<rights){
            lm=(rights-lefts)/3+lefts;
            mr=rights-(rights-lefts)/3;
            ansx=df(i,lm);anss=df(i,mr);
            if(ansx>anss) rights=mr-1;
            else lefts=lm+1;
        }
        ans=df(i,lefts);
        if(ans>hh)
            hh=ans;
    }
    printf("%.2lf\n",hh);
    return 0;
}
时间: 2024-10-13 03:43:41

2017-9-3 校内模拟T2取数win的相关文章

2017.6.11 校内模拟赛

题面及数据及std(有本人的也有原来的) :2017.6.11 校内模拟赛 T1 自己在纸上模拟一下后就会发现 可以用栈来搞一搞事情 受了上次zsq 讲的双栈排序的启发.. 具体就是将原盘子大小copy一下排个序 用两个指针维护两个数组(原数据 和 排序后的数据), 即分为1数据和2数组 将小于1指针指向的数据的2数组中的数据全部压入栈中 后进行消除, 将栈栈顶元素与当前1数组中的1指针指向的元素进行比较 相同则消除 后重复过程 直至指针超过N 后判断一下是否两个指针都超过了N... #incl

NOIp模拟3 取数游戏

试题描述 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点开始这个游戏,两人轮流取数,取数的规则如下: (1)选择硬币左边或者右边的一条边,并且边上的数非0: (2)将这条边上的数减至任意一个非负整数(至少要有所减小): (3)将硬币移至边的另一端. 如果轮到一个玩家走,这时硬币左右两边的边上的数值都是0,那么这个玩家就输了.如下图,描述的是Alice和Bob两人的对弈过程,其

2017.9.2 校内模拟赛

中规中矩的一套题. 然而辣鸡的我日常跪 卡SPFA是要哪样啊...再也不写SPFA了 100 + 0 + 70 = 170 "与" (and.pas/.c/.cpp) 时间限制:1s:空间限制64MB 题目描述: 给你一个长度为n的序列A,请你求出一对Ai,Aj(1<=i<j<=n)使Ai"与"Aj最大. Ps:"与"表示位运算and,在c++中表示为&. 输入描述: 第一行为n.接下来n行,一行一个数字表示Ai. 输出

蛇形填数和蛇形取数(基础模拟练习)

1 /* 2 问题 输入矩阵的规模n,先将数按照下,右,上,左的顺序填入矩阵,再按照这样的顺序取出. 3 解题思路 模拟,按照笔的顺序存入取出,注意初始化的时候一定将矩阵全部初始化. 4 */ 5 #include<cstdio> 6 #include<cstring> 7 const int N=1001; 8 int a[N][N],b[N][N]; 9 int main() 10 { 11 int n,i,j,tot,x,y; 12 while(scanf("%d&

【纪中模拟2019.08.03】【JZOJ1308】取数游戏

题目链接 题意: N个正整数围成一圈,规则如下: •两个玩家轮流取数:•先手玩家取任意一个数x:•从第二步开始当前玩家只能取x(上一玩家取的数)相邻的数:•直到取完所有的数,游戏结束:•取得较多奇数的玩家获胜. 保证双方都采取最优策略的同时,计算先手有多少种取法获胜. $1\le N\le 10^2,\quad 1\le x\le 10^3$ 实现(100分): 因为笔者不会SG函数,所以如果有绕弯子的描述请谅解. 分析博弈过程,有$2^n$种形势,按博弈写程序会T. 考虑DP,貌似取数的过程有

寻找ROS取数的瓶颈:思路整理

整个数据流要做的事情:先找到整个取数流程瓶颈所在,然后在造成瓶颈的部分进行优化. 有下面几个问题: 1.瓶颈分为硬件上的和软件上的.我要找的是软件上瓶颈.所以要先知道硬件的实际能力. 于是需要:对已知的机器做性能测试,知道能跑出多少带宽,用来与ROS的取数带宽做对照,如果没达到这个测试出来的带宽,就代表软件上哪里有瓶颈. 这一部分就是之前做的:不带组装时,在cmm03刀片上,iperf测试与ROS测试的对比.然而,对比的结果如何呢?这一部分有瓶颈吗?我是咋做的对照? 咋做的分析?我咋都忘了呢?

矩阵取数游戏

题目描述 Description [问题描述]帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下:1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素:2. 每次取走的各个元素只能是该元素所在行的行首或行尾:3. 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分= 被取走的元素值*2i,其中i 表示第i 次取数(从1 开始编号):4. 游戏结束总得分为m次取数得分之和.帅帅想请你帮忙写一个程序,对于任意矩

取数游戏

N(2 <=N<=200,且为偶数)个正整数的序列放在一个游戏平台上,A.B两人轮流从序列的两端取数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结束.以最终得分多者为胜(A先取,得分相同算A胜).试求: 如何取数,才能使得A与B的得分差距最大? (提示:A.B双方都在想方设法取胜) { 不是贪心不是模拟 想获胜不是从两端取最大的 f[i,j]表示在区间i,j先取数的人所能得到的最大得分 初始值f[i,i]:=ai; 从取第I个和区第J个中比较最大的 差值最大——一个人得分最高!

2017.09.03校内训练

T1:卡片 题解:这很明显,是一道选择题!!! 我们考虑每一种情况:只有一种卡片时,很显然最后剩下的只能是这一种:有三种卡片时,可以变成各只有一张,无论选取哪两张,都可以变成剩下的那一张,因此每一种都可以剩下:有两种的情况:若这两种都有两张以上,便可以各取一张合成没有的那一种,最后结果请参见上一条:若有一种只有一张,另一种有多张,则每一次的转化操作都要使用到较多的那种一张,不论如何都不可能合成较多张的那一种.因此结果是除了多于一张的那一种以外的其它两种:若这两种各只有一张,则结果必定是没有的那一