2 solutions

  • 1
    @ 2023-8-15 15:45:55

    代码1(先看这个,再看2):

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    
    int main(){
        int n;
        vector<LL> a;
        cin>>n;
        for(int i=1;i<=n;i++){
            LL c;
            cin>>c;
            a.push_back(c);
        }
        LL sum=0;
        //先从大到小删除负数
        for(int i=n-1;i>=0;i--){
            if(a[i]<0){
                sum += a[i]*(i+1);
                a.erase(a.begin()+i);
            }
        }
        //再从小到大删除正数
        for(int i=0;i<a.size();){
            sum += a[i]*1;
            a.erase(a.begin()+i);
        }
        cout<<sum;
        return 0;
    }
    

    代码2: (此代码一气呵成,考虑到删除的元素,若是负数,权重为本身下标;若是正数,权重为1,即从第一个元素开始。建议先看代码1,理解过程。)

    #include<iostream>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    int n, m, i;
    ll ans;
    int main()
    {
        cin >> n;
        for(i=1; i<=n; i++)
        {
            cin >> m;
            if(m < 0)
                ans += (ll)m*i;
            else
                ans += m;
        }
        cout << ans << endl;
        return 0;
    }
    
    • 0
      @ 2021-12-26 17:42:17

      思路

      贪心的想,我们如果想让代价最小,那么我们肯定是希望删除负数的时候使用ai×ia_i \times i 在它原本的位置的价值从后往前来删除,而对于正数,我们直接在第一个位置删除即可。

      Code

      #include<bits/stdc++.h>
      #include<ctime>
      #include<cstdlib>
      using namespace std;
      #define ll long long
      int main()
      {
      	ll n,k;
      	scanf("%lld",&n);
      	ll sum = 0;
      	for(int i = 1;i <= n; ++i) {
      		scanf("%lld",&k);
      		if(k < 0)	sum += k*i;
              else	sum += k;
      	}
      	printf("%lld\n",sum);
      	return 0;
      } 
      
      • 1

      Information

      ID
      267
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      3
      Tags
      # Submissions
      385
      Accepted
      109
      Uploaded By