3 条题解

  • 0
    @ 2024-10-20 22:18:10

    贪心+模拟

    令数组总和为numnum,显然,当sum>numsum > num时, 我们需要让原数组元素增大。sum<numsum<num时,我们需要减小原数组元素。 想要用最少的次数来修改,显然修改最值最优。 两种情况分别讨论,当sum>numsum>num,我们尽量修改原数组中较小的值,反之则修改较大的。排序后模拟即可

    #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
    上传者