分析:这题如果是用暴力呢,那么喜提TLE。思维转化一下就行:
首先:这个学费是从每个奶牛交的钱数中产生的
解释:举个例子:4头奶牛所交的学费情况:1 3 5 7
要使得尽可能多的奶牛能够上学,如果学费是6,那么前面3头奶牛都不能上学,要是学费是5,前面两头奶牛都不能上学。依次类推,你会发现,答案取每头奶牛的缴费情况的时候,会是最优的。
那么现在,我们只需要枚举一下在最优情况下,能够赚得的钱,再取一下max即可:
说说这里的优化方案:样例:1 6 4 6
先排一遍序:1 4 6 6
我们发现,如果学费是4(对应下标为2)的话,那么只有它前面的牛交不起学费,所以能够交学费的牛的数量为:4-2+1=3.然后同理:如果学费为第i头牛所能的交的学费时:有n-i+1头牛是可以交学费上学的。所以res=a[i]*(n-i+1)
代码:
#include <bits/stdc++.h>
#define pi acos(-1)
#define int long long
#define PII pair<int,int>
#define all(v) v.begin(),v.end()
#define INF 0x3f3f3f3f3f3f3f3f
#define fs(a) cout<<fixed<<setprecision(a)<< //fs(4)(1.0/3)=0.3333//保留a位小数
#define read() freopen("input.txt","r",stdin)
#define output() freopen("output.txt","w",stdout)
#define fast ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int N=2e6+10;
const int mod = 1e9+7;
const int Mod = 998244353;
int up(int a,int b){return a<0?a/b:(a+b-1)/b;}// a/b向上取整
int quickpow(int a,int n){int ans=1;while(n){if(n&1){ans*=a,ans%=Mod;}a*=a;a%=Mod;n>>=1;}return ans;}//快速幂
int qc(int a,int b,int p){int ans=0;while(b){if(b&1){ans+=a,ans%=p;}a*=2;a%=p;b>>=1;}return ans;}//快速乘 a*b%p
int a[N];
inline void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
int mx=0,ans=0;
for(int i=1;i<=n;i++){
int res=a[i]*(n-i+1);
if(res>mx) mx=res,ans=a[i];
}
cout<<mx<<" "<<ans;
}
signed main(){
fast; solve();
}