4 solutions

  • 1
    @ 2026-10-19 10:13:39
    //正数尽量在下标为 1 时删除,负数尽量在原来的下标处删除
    //先将所有负数按原下标从大到小删除。每次代价ai*i
    //再将所有非负数按原下标从小到大删除。每次代价ai
    #include<stdio.h>
    int main(void){
        int n;
        long long sum=0;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            long long a;
            scanf("%lld",&a);
            if(a>=0){
                sum+=a;
            }
            else{
                sum+=a*i;
            }
        }
       printf("%lld",sum);
    
    • 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
          @ 2024-12-8 23:04:03

          #include <stdio.h> int main() { int n,i; long long int sum=0,p[10000]; scanf("%d", &n); for(i=1;i<=n;i++) { scanf("%lld", &p[i]); if(p[i]>0)sum += p[i]; else { sum += (p[i] *i); } } printf("%lld\n", sum); return 0; }

          • 1

          Information

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