3 条题解
-
0
贪心+模拟
令数组总和为,显然,当时, 我们需要让原数组元素增大。时,我们需要减小原数组元素。 想要用最少的次数来修改,显然修改最值最优。 两种情况分别讨论,当,我们尽量修改原数组中较小的值,反之则修改较大的。排序后模拟即可
#include<bits/stdc++.h> using namespace std; #define int long long int a[200005]; void solve() { int n,m; cin >> n >>m; int sum=0; for(int i=1;i<=n;i++) { cin >> a[i]; sum+=a[i];求数组总和 } for(int i=1;i<=n;i++)//冒泡排序 { for(int j=1;j<=n-i;j++) { if(a[j]>a[j+1]) { int opp=a[j]; a[j]=a[j+1]; a[j+1]=opp; } } } int ans=0; if(sum<m) { for(int i=1;i<=n;i++) { ans++; int op=sum-a[i]; int num=m-op; if(num<=1e4&&num>=-1e4)//最后一次修改 { a[i]=num; break; } else { sum=sum-a[i]; a[i]=1e4;//贪心 sum=sum+a[i]; } } } else if(sum>m) { for(int i=n;i>=1;i--)/步骤同上 { ans++; int op=sum-a[i]; int num=m-op; if(num<=1e4&&num>=-1e4) { a[i]=num; break; } else { sum-=a[i]; a[i]=-1e4; sum=sum+a[i]; } } } cout <<ans<<'\n'; } signed main() { int t; cin >> t; while(t -- ) { solve(); } }
信息
- ID
- 1024
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 121
- 已通过
- 12
- 上传者