42pts求助
查看原帖
42pts求助
68574
HGJH°L楼主2021/2/1 20:35

哪位大佬能帮忙看看啊?已经卡了一个多月了/kk

提交记录

#include<bits/stdc++.h>
#define ll long long
#define INF 0x7f7f7f7f
#define lowbit(x) x & -x
#define re register

using namespace std;

ll read()//快读
{
    ll w=0;
    char c=getchar();
    while (c<'0'||c>'9')//不读负号
        c=getchar();
    while (c>='0'&&c<='9')
    {
        w=(w<<3)+(w<<1)+c-'0';
        c=getchar();
    }
    return w;
}

void print(unsigned ll p)//快输
{
    if (p>9)
        print(p/10);
    putchar(p%10+'0');
    return ;
}

void Print(unsigned ll p,char c)
{
    print(p);
    putchar(c);
    return ;
}

int n;
unsigned ll ans;
ll maxx,maxy;
int i,j,k;

struct node
{
    ll x;
    ll y;
    bool f;
}a[5003];//坐标点

ll max(ll a,ll b)
{
    return a>b?a:b;
}

bool cmp(node x,node y)
{
    return x.x+x.y<y.x+y.y;//便于后面比较
}

int main()
{

    n=read();
    for (i=1;i<=n;i++)
    {
        a[i].x=read();
        a[i].y=read();
        a[i].f=1;//初始化
    }
    sort(a+1,a+n+1,cmp);//排序
    for (i=1;i<n;i++)
        for (j=i+1;j<=n;j++)
            if (a[i].x<=a[j].x&&a[i].y<=a[j].y)//如果横纵坐标都更大
                a[i].f=0;//标记
    for (i=1;i<=n;i++)
    {
        if (!a[i].f)//如果a[i]已经被标记
            continue;//跳过
        for (j=1;j<=n;j++)
        {
            if (!a[j].f||j==i)//如果a[j]已经被标记或是重合
                continue;//跳过
            maxx=max(a[i].x,a[j].x);//计算二者坐标最大值
            maxy=max(a[i].y,a[j].y);
            if ((maxx*maxy)<=(a[i].x*a[i].y+a[j].x*a[j].y))//如果两个合并能够优化答案
            {
                a[i].x=maxx;//坐标变为最大值
                a[i].y=maxy;
                a[j].f=0;//另一个进行标记
            }
        }
    }
    for (i=1;i<=n;i++)//从头到尾进行扫描
        if (a[i].f)//如果没有被标记
            ans+=a[i].x*a[i].y;//算面积
    cout <<(ans*4)<<endl;/*最后乘四
    for (i=1;i<=n;i++)//检测
    {
        Print(a[i].f,' ');
        Print(a[i].x,' ');
        Print(a[i].y,'\n');
    }*/
    return 0;
}

对拍也跑了好几趟了,没啥问题,可一到洛谷上就不行,这是怎么回事呢?哪位好心的大佬能指点下萌新QAQ,感激不尽

2021/2/1 20:35
加载中...