首页 > 其他分享 >12.26 CW 模拟赛 T1. 平均

12.26 CW 模拟赛 T1. 平均

时间:2024-12-26 15:19:03浏览次数:3  
标签:Right int 平均数 12.26 Mid T1 Ans CW Left

思路

首先你发现假设当前的平均数是 \(a\) , 其中 \(\lceil a \rceil = k\) , 那么你势必要选上所有 \(< k\) 的数来拉低平均数, 然后贪心的从小到大选 \(\geq k\) 的数来提高贡献

如果想不到也可以这样想, 对于一个确定的平均数, 一定要尽可能的让比平均数小的数更多, 才能更多的腾出空间给大于平均数的数

显然的, 这样子搞完之后, 每次选择的一定是一段排序后数列的前缀, 你对前缀做一点二分操作就可以计算出答案了


以下是赛时想歪之后的思路, 我看看还能不能救回来

赛时发现, 最优解可以看做把排序后的数列 (以下简称数列) 分成两段, 分别取两端的前缀组合就可以找到一个不劣的答案

其实容易发现, 每次假设把 \(a\) 数列分成两部分 \(u, v\) , 那么显然的, 如果你对于一个确定的 \(v\) 进行分析, \(u\) 一定是选完 \(v\) 之前的所有最优, 也就是说 \(u, v\) 显然连在了一起拼成了前缀

代码

没有难度, 脑子没转过来

#include <bits/stdc++.h>
// #define FILE_IO
#define int long long
const int MAXN = 1e6 + 20;

int n;
int a[MAXN];

class Brute_Force
{
private:
    int Ans = 0;

public:
    void solve() {
        std::sort(a + 1, a + n + 1);

        for (int p = n; p >= 1; p--) {
            int rsum = 0;
            for (int r = p; r <= n; r++) {
                rsum += a[r];
                int lsum = 0; bool flag = false;
                for (int l = 1; l < p; l++) {
                    lsum += a[l];
                    if ((r - p + 1ll + l) * a[p] > lsum + rsum) {
                        Ans = std::max(Ans, r - p + 1ll);
                    }
                }
            }
        }
        printf("%lld", Ans);
    }
} BF;

class Greedy
{
private:
    int binsearch(int l, int r, int sum, int num) {
        int Left = l, Right = r + 1;
        while (Left < Right) {
            int Mid = (Left + Right) >> 1;
            if (a[Mid] * num > sum) Right = Mid;
            else Left = Mid + 1;
        }
        return Left;
    }

public:
    void solve() {
        std::sort(a + 1, a + n + 1);
        int sum = 0;
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            sum += a[i];
            int res = binsearch(1, i, sum, i);
            ans = std::max(ans, i - res + 1);
        }
        printf("%lld", ans);
    }
} GR;

signed main()
{
#ifdef FILE_IO
    freopen("average5.in", "r", stdin);
    freopen("average5.out", "w", stdout);
#endif
    scanf("%lld", &n);
    for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);

    // if (n <= 500) BF.solve();
    GR.solve();

    return 0;
}

总结

平均数很好的性质, 贪心策略的应用

如果赛时思维想糊了考虑化枚举为单点的正确性, 对于简单题来说一般是这样的

最好是因为难受才没有做出来, 说不定就是菜

标签:Right,int,平均数,12.26,Mid,T1,Ans,CW,Left
From: https://www.cnblogs.com/YzaCsp/p/18632934

相关文章

  • CW 12.26 模拟赛 赛时记录
    前言虽然说有点难受,但是还是好好考考试只需要管考试相关的即可,别想太多冷静,就这样看题先过一遍吧,看看感觉怎么样,今天时间要短一点,不开心\(\rm{T1}\)至少题意清楚,不管了\(\rm{T2}\)这么有实力,很像\(\rm{Indec\Sequence}\)\(\rm{T3}\)多半要观察性质......
  • 2024.12.26 os lab3
    2024.12.26oslab3原代码地址:https://github.com/BUPT-OS/easy_lab/tree/lab3运行未修改的代码,并且注释掉cout时发生错误:malloc():corruptedtopsize如果不注释cout,可以正常运行1.不注释cout时堆内存的详细分析1.程序启动阶段在程序启动时,堆的初始状态为空,堆顶指......
  • hot100-一刷-12栈(共5道题)
    20.有效的括号题目链接题目描述代码实现分析:代码:classSolution{publicbooleanisValid(Strings){intn=s.length();if(n%2==1)returnfalse;Deque<Character>st=newLinkedList<>();for(charc:s.toCharArray......
  • ybt1676手机游戏
    1676:手机游戏时间限制:1000ms内存限制:131072KB【题目描述】明明的手机上有这样一个游戏,一排\(n\)个怪物,每个怪物的血量是\(m_i\)。现在明明可以射出k个伤害均为\(p\)的火球,当某个火球射到第\(i\)个怪物,除了这个怪物会掉血\(p\)以外,它左边的第\(j\)个怪物\((j≤i)......
  • 如何使用WGAN-GP生成一维滚动轴承振动数据样本。以西储大学(CWRU)数据集为例,提供一个基
    使用WGAN-GP生成一维滚动轴承振动数据样本。以西储大学(CWRU)数据集为例,提供一个基于训练好的权重参数文件进行测试的代码。WGAN-GP-1D轴承振动数据样本生成方法,西储大学数据集为例,可替换自己的数据。代码注释清楚,包含训练过程的代码train_gan和基于训练好的权重参数文件......
  • 12.24 CW 模拟赛 赛时记录
    前言考试期间,只需要考虑考试策略即可,别的都别管了先打暴力,想正解不超过\(40\\rm{min}\),最后拼高档/正解,冷静,认真分析看题现在看到不按难度排序已经免疫了,感觉是防锅专用语?\(\rm{T1}\)题意非常清楚,可能挖下性质还是可以做的\(\rm{T2}\)我不到啊,但......
  • ybt1675塔
    1675:塔时间限制:1000ms内存限制:262144KB【题目描述】你有\(N\)座塔一列排开。每座塔各自有高度,有可能相等。你每次可以选择相邻的两座塔合并在一起,即这两座塔的高度叠加后变成了同一座塔。然后原本分别与这两座塔相邻的塔变得与这座新的塔相邻。你的目标是使用......
  • 404、基于51单片机的大棚控制仿真设计(温湿度CO2,DHT11,LCD1602)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能大棚温湿度、二氧化碳含量控制系统:1、检测温湿度(DHT11)2、检测二氧化碳浓度(电位器代替)3、设置上下限,如果参数过限,启动控制自动调控大......
  • hot100-一刷-11二分查找(共6道题)
    题目题目链接题目描述代码实现分析:代码:题目题目链接题目描述代码实现分析:代码:题目题目链接题目描述代码实现分析:代码:题目题目链接题目描述代码实现分析:代码:题目题目链接题目描述代码实现分析:代码:题目题目链接题目描述代码实现分析:代......
  • CW信号的正交解调
    1.CW信号  CW可以叫做等幅电报,它通过电键控制发信机产生短信号"."(点)和长信号"--"(划),并利用其不同组合表示不同的字符,从而组成单词和句子。  CW信号可以看作一种幅度调制信号,类似于幅移键控(2ASK信号)其携带的信息保存在其幅度中,通过改变载波的幅度来实现基带数据的传输。其函......