题目
题目描述
众所周知,猫的故乡是遥远的星球“喵星”,他们来到地球是为了奴役无知的人类。成功征服地球后,喵始皇有了征服世界的打算,他深知打铁还得自身硬,决定为了“喵星”新一代的喵星人开设一所大学——“喵星学院”,用于传授生存和战斗技巧。
有 n 只喵星人可能会报名入学,编号依次为 1∼n,第 i只喵星人最多愿意支付 Wi的报名费,喵始皇可以设定报名费的高低。如果一只喵星人愿意支付的最高金额不小于报名费,那么这一只喵星人就会报名进入“喵星学院”。
为了给学院中的教官提供一笔可观的工资,喵始皇想赚取更多的钱。请你帮助他计算报名费应该设定多少以及能够赚到的钱的金额最大是多少。
输入描述
第一行,包含一个整数 n。
第二行,包含 n个整数 W1,W2,…,Wn
输出描述
一行,两个整数,分别表示可以赚到的最大金额和设定的报名费用。如果有多个解,输出报名费最小的解。
样例1
输入
5
6 8 2 4 5
输出
16 4
样例2
输入
4
3 9 6 9
输出
18 6
提示
样例 1
解释:如果喵始皇设定报名费为 4,那么会有 4只喵星人报名进入学院,从而使他赚取 4×4=16的金额,可以证明没有其他更好的方案。
样例 2
解释:如果喵始皇设定报名费为 6,那么会有 3只喵星人报名进入学院,从而使他赚取 3×6=18 的金额。可以注意到还有一种方案,设定报名费为 9,那么会有 2只喵星人报名进入学院,从而使他赚取2×9=18 的金额,这两种方案下能够赚取的金额相同,所以选择设定报名费较小的一个解。
对于 30% 数据保证:1≤n≤5000。
另外 30% 数据保证:1≤Wi≤1000
对于 100% 数据保证:1≤n≤10^5,1≤wi≤10^6
代码
#include<bits/stdc++.h>
using namespace std;
int w[100005],s[1000005],n,maxx;
int solve(int mid)
{
long long cnt=0;
for(int i=mid;i<=maxx;i++)
{
cnt+=s[i];
}
return cnt;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i];
s[w[i]]++;
maxx=max(maxx,w[i]);
}
int l=1,r=maxx;
long long ans=0;
while(l<=r)
{
int mid=(l+r)/2;
if(solve(mid)>=ans)
{
ans=solve(mid);
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans<<" "<<l;
}
跪求大佬改代码