题意:
将1~n排序后与下标相乘,减去其中的最大值,并让结果最大。
思路:
算一下n=1,2,3,4的情况,发现可以枚举i,让i前的数顺序排列,从i开始逆序排列,计算得最大值。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=255;
ll sum[N];
void init(){
for(int i=1;i<=250;i++){
sum[i]=sum[i-1]+i*i*1ll;
}
}
void solve() {
int n;
cin>>n;
ll pre=sum[n-1];
ll ans=0;
for(int i=n-1;i>=1;i--){
ll mx=0;
ans=sum[i-1];
//cout<<ans<<endl;
ll wei=n;
for(int j=i;j<=n;j++){
ll a=j*wei;
mx=max(mx,a);
ans+=a;
wei--;
}
ans-=mx;
// cout<<i<<" "<<ans<<" "<<mx<<endl;
pre=max(ans,pre);
}
cout<<pre<<endl;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
init();
int t; cin >> t;
while (t--) solve();
}
思考:
有的时候算不清时间复杂度,总想写的简练一点,却又没那个水平,还不如直接枚举,写起来又轻松又快。还有初始位置搞清楚啊!特别是要放循环外还是内的问题!!!