考场上以为这道题 bfs +划分 dp (我太菜了见谅)。最后直接摆烂不写了。就写了个把前四大的点加起来的程序。结果民间数据给出了个60分......
代码(文件操作已注释)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2500,M=1e4;
int n,m,k;bool vis[N];
ll a[N],s[N],dp[5][N][105],ans;
vector<int>e[N];
struct node{
int u,fa,step;
ll w;
node(int u,int fa,int step,ll w):u(u),fa(fa),step(step),w(w){}
};
queue<node>q;
signed main(){
// freopen("holiday.in","r",stdin);
// freopen("holiday.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
for(int i=2;i<=n;i++)scanf("%lld",a+i);
sort(a+1,a+1+n);
for(int i=1,j=n;i<=4;i++,j--)ans+=a[j];
cout<<ans<<endl;
// for(int i=1;i<=m;i++){
// int u,v;
// scanf("%d%d",&u,&v);
// e[u].push_back(v);
// e[v].push_back(u);
// }q.push(node(1,0,0,0));
// while(!q.empty()){
// int u=q.front().u,fa=q.front().fa;
// int step=q.front().step;
// ll w=q.front().w;q.pop();
// if(step>2)continue;vis[u]=1;
// s[u]=w;
// for(int i=0,len=e[u].size();i<len;i++){
// int v=e[u][i];
// if(vis[v]){
// ans=max(ans,w+s[v]);
// s[v]=max(s[v],w);
// continue;
// }q.push(node(v,u,step+1,w+a[v]));
// }
// }cout<<ans<<endl;
return 0;
}