F. False God

思维+建图

首先,万物起源:
对于这种两个变动的题目,我们相对的看
可以给金的每次移动向前增加一位

然后我们在草稿上画出一个金可以走到的所有格点
会发现,正好以斜线为界限的范围是这个金可以走到的地方

但是,还有一个问题,这里是一轮过后,即金和步都走一步后
但是还有可能步还没走就让金吞了

因此,为了避免这种情况下的漏算,我们不妨拆点,对于每一个点
我们拆一个点正好在他头上。

然后我们遍历,连边
对于拆的点,我们原来的点不和他连边

但是,这样有一个问题:
即,如果出现了两个原来的点他们正好连着,即点b在点a的头上
那么我们就尴尬了

为了解决这个问题
我们换统计点权为统计边权
我们事先排序,在此之后我们再判断是否存在这种情况
如果存在这种情况,我们让a->b,权值为1,且让之后所有的连向b的点权值都赋为2
否则,我们拆点

然后还有一个坑点,就是,如果初始时,我们有一个点正好在金的正下方
那么我们最终的答案还要加上
(但是在代码中,我是连接金和这个点了)

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int max_n = 10010;
const int max_m = 1e7;
struct edge
{
    int to,cost,next;
}E[max_m];
int head[max_n];
int cnt=1;
void add(int from,int to,int cost)
{
    E[cnt].to=to;
    E[cnt].cost=cost;
    E[cnt].next=head[from];
    head[from]=cnt++;
}
ll xs[max_n],ys[max_n];
int tot=0;
bool check(int i,int j)
{
    return ys[j]>ys[i] && llabs(xs[j]-xs[i])<=llabs(ys[j]-ys[i]);
}

int used[max_n];
int dfs(int u)
{
    if (used[u])return used[u];
    int ans=0;
    for (int i=head[u];i;i=E[i].next)
    {
        int v = E[i].to;
        ans=max(ans,E[i].cost+dfs(v));
    }
    return used[u]=ans;
}


int weights[max_n];
int help[max_n];
bool cmp(int a,int b)
{
    return xs[a]==xs[b]?ys[a]<ys[b]:xs[a]<xs[b];
}

int main()
{
    ios::sync_with_stdio(0);
    int T;cin>>T;
    while (T--)
    {
        tot=1;
        cin>>xs[tot]>>ys[tot];
        int n;cin>>n;
        for (int i=0;i<=n*2+100;++i)head[i]=used[i]=weights[i]=0,help[i]=i;
        cnt=1;
        for (int i=1;i<=n;++i)
        {
            ++tot;
            cin>>xs[tot]>>ys[tot];
        }

        sort(help+2,help+2+n);

        for (int _=2;_<=n;++_)
        {
            int i = help[_];
            int j = help[_+1];
            if (xs[i]==xs[j] && ys[i]==ys[j]-1)
            {
                weights[j]=1;
            }
            else
            {
                ++tot;
                xs[tot]=xs[i];
                ys[tot]=ys[i]+1;
                if (xs[tot]==xs[1] && ys[tot]==ys[1])
                {
                    add(1,tot,1);
                }
            }
        }

        for (int i=1;i<=tot;++i)
        {
            for (int j=1;j<=tot;++j)
            {
                if (llabs(ys[i]-ys[j])<=1 && xs[i]==xs[j])continue;
                if (check(i,j))
                {
                    add(i,j,1+weights[j]);
                }
            }
        }
        cout<<dfs(1)<<endl;
    }
}
全部评论

相关推荐

吾族血脉,自吾始立铁律:凡我子孙,胆敢研习计算机之术者,当受七窍流血之刑!若见Python之书,必遭雷殛;若触Java代码,定为不孝!键盘鼠标准入族谱秽物录,显示器乃摄魂邪镜祖祠前当立戒碑:"二进制者,断子绝孙之道也!"算法者,乱我族心智之毒也!数据结构,毁我门风之刃也!倘有逆子偷装&nbsp;vscode,即按祖规捆于祠堂梁柱,令其DEBUG至死不得解脱!今颁天条三则:壹)三代血亲不得报考计算机系违者削去辈分,永世称码奴贰)族中幼童须背《戒算经》"if-else咒,switch符,皆是断头术"叁)凡见子侄讨论编程者须即刻砸其电脑,焚其书籍泼黑狗血于键盘之上!太祖母口谕:"吾宁要文盲孙,不要程序员!"尔...
好吃的薯饼:姐妹这不是我们计算机系吧,我们计算机系的都在言情小说里当黑客大佬,各种竞赛拿奖拿到手软,公司系统道路监控随便入侵。身体线条非常优美,挺拔的站姿十分端正,给人以强壮有内涵的感觉。脸庞轮廓深刻,五官分明透露着对太阳底下最光辉的职业的向往和坚定,尤其是那双深邃的眼睛,写满了对代码和计算机系统的热情和无限的活力。我们计算机系是天之骄子、明日之星,人手一个博士学位不然高中电脑老师都当不上。组会的时候,面对导师和同事的疑难问题,也能够回答自如。我们总是把高高的发际线当做荣耀的象征。妈咪这不素我们计算机系吧,集美集帅怎么只会写hello world?
点赞 评论 收藏
分享
mq2:我倒是觉得这种敞亮一点好。能接受就去不能就不去呗。 完了跟现在“正常”公司一样,hr说的天花乱坠,进去一看根本就是996核动力牛马,想走又没应届生身份了。岂不是更糟。
点赞 评论 收藏
分享
昨天 23:51
门头沟学院 Java
Snailrunning:没准就是部门 HC 已经发完了,放平心态
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务