3 solutions
-
1
代码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
思路
贪心的想,我们如果想让代价最小,那么我们肯定是希望删除负数的时候使用 在它原本的位置的价值从后往前来删除,而对于正数,我们直接在第一个位置删除即可。
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
- 527
- Accepted
- 128
- Uploaded By