zoukankan      html  css  js  c++  java
  • CF1334B

    大力猜结论的贪心题。
    先把 (a) 数组升序排序一下。
    弄两个预处理数组。(rich[i]) 表示排序后(i) 个人中富人的个数,(s[i]) 表示排序后(i) 个人钱数的后缀和。
    于是枚举 (i=0,1,cdots,n-1),判断后 ((n-i)) 个人平均分财产后的富人数量与当前的富人数量哪一个大。就这样一直打擂台下去就能找到最大化的富人数量了。
    Code:
    记得开long long

    #include <bits/stdc++.h>
    #define ll long long
    const char* chk[]={"NO","YES"};
    using namespace std;
    const int maxN=100005;
    int n,x,a[maxN],rich[maxN];
    ll s[maxN];
    void solve();
    int main() {
        int t;scanf("%d",&t);
        for (;t;t--) solve();
        return 0;
    }
    void solve() {
        memset(rich,0,sizeof rich);
        memset(s,0,sizeof s);
        // 多组数据,记得清空数组
        scanf("%d%d",&n,&x);
        for (int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        for (int i=1;i<=n;i++) rich[i]+=a[i]>=x;
        for (int i=n;i;i--) s[i]=s[i+1]+a[i];
        // 预处理 rich[] 和 s[] 数组
        //printf("s[1]=%d
    ",s[1]);
        int ans=rich[n];
        for (int i=0;i<n;i++) {
            double get=1.0*s[i+1]/(n-i);
            // get 表示后 (n-i) 个人总财产的平均数
            //printf("get=%lf
    ",get);
            int now=rich[i];
            if (get>=x) now+=n-i;
            ans=max(ans,now); // 打擂台找最大化的富人数
            //printf("now=%d
    ans=%d
    ",now,ans);
        }
        printf("%d
    ",ans);
    }
    
    
  • 相关阅读:
    【Beta】Scrum Meeting 8
    【Beta】Scrum Meeting 7
    【Beta】Scrum Meeting 6
    【Beta】Scrum Meeting 5
    【Beta】Scrum Meeting 4
    【Beta】Scrum Meeting 3
    “北航Clubs”项目汇报
    Alpha阶段展示报告
    Alpha阶段产品功能说明
    Alpha阶段个人贡献分
  • 原文地址:https://www.cnblogs.com/Xray-luogu/p/12679325.html
Copyright © 2011-2022 走看看