NC200437. 这是最难的题
描述
输入描述
先输入一个值n,再输入一个值m,接下来一行n个数,第i个数代表第i个装备的数量。
输出描述
一个整数,你能够武装的最多士兵数。
示例1
输入:
5 3 3 1 2 3 3
输出:
4
C++11(clang++ 3.9) 解法, 执行用时: 30ms, 内存消耗: 1672K, 提交时间: 2019-12-19 12:35:51
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> P; ll a[200005]; int main() { ll n,k; scanf("%lld%lld",&n,&k); ll A=0; for(int i=1;i<=n;i++)scanf("%lld",&a[i]),A+=a[i]; sort(a+1,a+n+1,greater<ll>()); ll X=0; for(ll w=1;w<k;w++) { X+=a[w]; A-=a[w]; if(X*(k-w)>w*A)X=A*w/(k-w); } ll sum=X+A; printf("%lld\n",sum/k); return 0; }
C++14(g++5.4) 解法, 执行用时: 35ms, 内存消耗: 2016K, 提交时间: 2020-02-24 11:31:21
#include<stdio.h> #include<algorithm> using namespace std; #define ll long long int main() { ll n,m,a[100010],b[100010]={0}; scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++)scanf("%lld",&a[i]); sort(a+1,a+n+1); for(int i=1;i<=n;i++)b[i]=b[i-1]+a[i]; ll t=m; ll ans; for(int i=n;i>n-m;i--){ if(b[i]/t>=a[i]){ ans=b[i]/t; break; } else t--; if(i==n-m+1)ans=a[i]; } printf("%lld\n",ans); }