比赛 EYOI与SBOI开学欢乐赛5th 评测结果 EEEEE
题目名称 最优连通子集 最终得分 0
用户昵称 什么都想学什么都学了一点的晓无痕 运行时间 0.912 s
代码语言 C++ 内存使用 5.75 MiB
提交时间 2022-09-16 21:18:44
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int N;
int anse=-101;
int f[1001];
int muq[1][1];
struct zbx
{
    int x;
    int y;
    int score;
}mp[1001];
bool cmp(zbx a,zbx b)
{
    if(a.x==b.x)
    {
        return a.y<b.y;
    }
    else
    {
        return a.x<b.x;
    }
}
int main()
{
    freopen("subset.in","r",stdin);
    freopen("subset.out","w",stdout);
    scanf("%d",&N);
    for(int i=1;i<=N;++i)
    {
        scanf("%d%d%d",&mp[i].x,&mp[i].y,&mp[i].score);
    }
    mp[N+1].x=-1000001;
   sort(mp+1,mp+N+1,cmp);
    int i=1;
    for(int j=1;j<=N;++j)
    {
        f[j]=mp[j].score;
    }
    int last=-101;
    while(i<=N)
    {
        int j=i;
        while(mp[j].x==mp[i].x)
        {
            ++j;
        }
        int cntt;
        if(i!=j-1)
        {
        for(int k=j-1;k>=i;--k)
        {
            if(mp[k].y==mp[j].y)
            {
              cntt=k;
              break;  
            }
        }
        for(int k=i;k<cntt;++k)
        {
            f[k+1]=max(f[k+1]+f[k],f[k+1]);
        }
        for(int k=j-1;k>cntt;--k)
        {
            f[k-1]=max(f[k-1]+f[k],f[k-1]);
        }
        f[j]=max(f[j],f[j]+f[cntt]);
        f[j]=max(f[j],f[j]+last);
        last=f[j];
        }
        if(i==j-1)
        {
            f[i]=max(f[i],f[i]+last);
            last=f[i];
            ++i;
        }
        i=j;
        if(i>=N)
        {
            break;
        }
    }
    sort(f+1,f+N+1);
    printf("%d",f[N]);
    return 0;
 }