校内胡策 agar - BFS

problem 2 agar(agar.cpp)
题目描述
Skyfall 最近迷上了一个叫做 agar 的游戏。在这个游戏中,地图由 N*M 的点阵构成,每个 cell
占有一个点。体积大的 cell 可以吃掉体积小的 cell,吃掉之后,较大的 cell 的大小会增加被
吃掉的 cell 的大小。
比如:你的大小为 3,吃掉了一个大小为 2 的 cell 之后你的大小变为 5。
现在,地图上有 T 个细胞,第 i 个细胞的大小为 Qi,位置为 Xi,Yi 。( 保 证 这 T 个 cell 坐标互不
相同且 Qi>0)
这些 cell 被 dc 的魔法定住了(也就是说这些 cell 不可以主动移动) skyfall 的大
小为 Q0,skyfall 的出生位置为(X0,Y0),skyfall 可以向上向下向左向右运动
Skyfall 当然不想自己被吃掉,同时他也想知道自己最多吃掉多少个 cell
1:可能存在 skyfall 一个 cell 都吃不到的情况
2:若 skyfall 主动跟一个等大的 cell 在一个坐标,那么 skyfall 与他共存且不可移动
输入描述
第一行 N M T 表示地图的大小与细胞的个数接下来 T 行 每行三
个整数 Qi Xi Yi 表示第 i 个 cell 的大小位置
最后一行为 Q0 X0 Y0 表示 skyfall 的初始大小与位置
输出描述
两个整数:第一个整数表示 skyfall 最多吃掉多少细胞,第二个整数 skyfall 吃掉这些细胞后的最
终大小
如果 skyfall 被吃了,输出”233”(不带引号)
样例输入
3 3 4
10 1 1
4 1 2
10 2 1
2 3 3
5 2 2
样例输出
4 31
数据范围及提示
对于 50%的数据,N<=10,M<=10,所有细胞的大小均在 100 以内随机得到。
对于 100%的数据,N,M <= 1000;T<=50000,所有数据的大小均在 long long 范围内(意思就是
你不需要打高精),每个细胞的坐标均满足:1<=x<=N,1<=y<=M。

AC Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
int dx[]={0,0,-1,1},dy[]={1,-1,0,0};
ll map[1100][1100];
bool vis[1100][1100];
ll n,m,t,Q;
ll read()
{
    char ch=‘ ‘;int w=1;ll a=0;
    while(ch<‘0‘||ch>‘9‘)
    {
        if(ch==‘-‘) w=-1;
        ch=getchar();
    }
    while(ch>=‘0‘&&ch<=‘9‘) a=a*10+ch-‘0‘,ch=getchar();
    return w*a;
}
struct node{
    int x,y;
};
queue<node>q;
priority_queue<ll,vector<ll>,greater<ll> >h;
ll ansc=0,ansz=0;
void bfs()
{
    while(q.size())
    {
        node a=q.front();q.pop();
        int x=a.x,y=a.y;
        for(int i=0;i<4;i++)
        {
            int xx=x+dx[i],yy=y+dy[i];
            if(xx>0&&xx<=n&&yy>0&&yy<=m&&!vis[xx][yy])
            {
                vis[xx][yy]=1;
                if(map[xx][yy]>=ansz)
                //!!若存在现在吃不了的细胞 可先将其加入一个小根堆 等到再遇到可以吃的细胞时再判断能否被吃掉 就不用再回去吃了
                {
                    h.push((ll){map[xx][yy]});
                }
                else
                {
                    if(map[xx][yy])
                    {
                        ansc++,ansz+=map[xx][yy];
                        //!! 当时吃不了的细胞 现在可能会被吃掉
                        while(h.size()&&h.top()<ansz)
                        {
                            ansz+=h.top();
                            ansc++;
                            h.pop();
                        }
                        q.push((node){xx,yy});
                    }
                    else
                    {
                        q.push((node){xx,yy});
                    }
                }
            }
        }
    }
}
int main()
{
    n=read(),m=read(),t=read();
    ll x,y;
    for(int i=1;i<=t;i++)
    {
        Q=read(),x=read(),y=read();
        map[x][y]=Q;
    }
    Q=read(),x=read(),y=read();
    if(map[x][y]>Q)
    //如果正好出生在比它大的细胞上 就会直接被吃掉
    {
        printf("233");return 0;
    }
    else
    {
        ansz+=Q;
        //!!! 先加上自身的大小 因为会存在”出生在和它等大的细胞上“的情况
        if(map[x][y]&&map[x][y]<Q)
        //如果出生在比它小的细胞上 答案累加
            ansz+=map[x][y],ansc++;
    }
    q.push((node){x,y});
    vis[x][y]=1;
    bfs();
    printf("%lld %lld",ansc,ansz);
    return 0;
}
/*
3    3    4
10    1    1
4    1    2
10    2    1
2    3    3
5    2    2

4 31
*/

原文地址:https://www.cnblogs.com/Loi-Brilliant/p/8783442.html

时间: 2024-10-04 12:08:23

校内胡策 agar - BFS的相关文章

校内胡策(唯一一个想出来的)

2 第一题 (third.cpp/c/pas) 题目描述 小 R 最近沉迷于一个叫做 Slay.one 的游戏. 在这个游戏中,每一局有若干人参加,最终会产生一个优胜者.优胜者会获得 一个成就点. 现在小 R 已经利用某种手段得知了每场游戏有哪些人参加.假设所有人最初成 就点都是 0 ,小 R 想要知道所有游戏结束之后成就点最多的人至少有多少成就点. 校内胡策(唯一一个想出来的) 原文地址:https://www.cnblogs.com/Lance1ot/p/9445468.html

校内胡策 埃罗芒阿老师 - 贪心 &amp; 堆 + EX难度 - DP

题目描述 埃罗芒阿老师是著名的插画家,她的工作是为电击文库出版的的书画插画.快要到截稿日了,埃罗芒阿老师还在水>_<埃罗芒阿突然发现自己还有一大堆插画没有完成,如果不能在截稿时间内完成是要扣工资的.于是埃罗芒阿老师把每个任务所需的时间和现在(0 时刻)距离每个任务截稿的时间记录了下来,想要计算出最多可以完成多少任务.输入描述 第一行是一个整数 N,接下来 N 行每行两个整数 T1,T2 描述一个任务:完成这个任务需要 T1 秒,如果在 T2 秒之内还没有完成任务,这个任务就到截稿时间了.输出描

校内胡策 T9270 mjt树

题目背景 从前森林里有一棵很大的mjt树,树上有很多小动物. 题目描述 mjt树上有 n 个房间,第 i 个房间住着 ai 只第bi 种小动物. 这n个房间用n-1条路连接起来,其中房间1位mjt树的根. 现在每个房间x的小动物想知道,以房间x为根的mjt树中有多少只它们的同类. 输入输出格式 输入格式: 第一行一个整数n,表示房间数 接下来n行,每行两个整数ai,bi 再之后n-1,每行两个整数x.y,表示x和y之间有一条路径 输出格式: 一行n个数,第i个数表示以房间i为根的mjt树中bi种

弱省胡策系列简要题解

现在不是非常爽,感觉智商掉没了,就整理一下最近弱省胡策的题目吧. 其实题目质量还是很高的. 如果实在看不懂官方题解,说不定这里bb的能给您一些帮助呢? [弱省胡策]Round #0 A 20%数据,O(n4)傻逼dp. 40%数据,O(n3)傻逼dp. 100%数据,令f(x1,y1,x2,y2)表示从(x1,y1)走到(x2,y2)的路径条数.于是所有路径就是f(1,2,n?1,m)×f(2,1,n,m?1).然而两条路径可能在中间的某个点相交,我们找出最早的交点,并在这个交点互换两条路径的后

【弱校胡策】2016.4.14 (bzoj2164)最短路+状压DP+矩阵乘法+高斯消元+树链剖分+线段树+背包DP

cyyz&qhyz&lwyz&gryz弱校胡策 命题人:cyyz ws_fqk T3暴力写挫了 50+10+0滚粗辣! 奇妙的约会(appointment.cpp/c/pas) [问题描述] DQS和sxb在网上结识后成为了非常好的朋友,并且都有着惊人 的OI水平.在NOI2333的比赛中,两人均拿到了金牌,并保送进入 HU/PKU.于是两人决定在这喜大普奔的时刻进行面基. NOI2333参赛选手众多,所以安排了n个考点,DQS在1号考点, 而sxb在n号考点.由于是举办全国性赛事

山西胡策 #7

A. B. C. 题意:给出(i, j)之类的约束表示要j必须先i,问1尽量靠前.2尽量靠前.3尽量靠前以此类推的最优方案,或输出无解. #include <bits/stdc++.h> using namespace std; const int N=100005; int cnt, ihead[N], in[N], ans[N], tot, n, m; struct E { int next, to; }e[N]; void add(int x, int y) { e[++cnt]=(E)

QBXT2018 4 29 DP&amp;图论班 胡策 by zhx

PS:由于长者是以我们没有学过图论与DP的基础上出的题,所以可能(?)会有点水. 题意: T1:判断括号序列是是否合法.可以利用栈,别忘了判断最终栈是否为空. #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; char s[1000],z[1000]; int size; int main() { scanf("%s",s+1); int l=strle

山西胡策 #6

A. 题意:求去掉d物品后容量为e最大背包.每个物品有三种属性,权值.容量.数量. #include <bits/stdc++.h> using namespace std; const int V=1000, N=1005; void zop(int *d, int w, int v) { for(int i=V; i>=v; --i) d[i]=max(d[i], d[i-v]+w); } void cmp(int *d, int w, int v) { for(int i=v; i

STOI补番队胡策

#1 第一轮是我出的. 比赛情况: #1 NanoApe 300 (完美AK) #2 && #3 swm_sxt / ccz  200 A.candy 这道题就是个nim游戏, 我们知道当且仅当选出的各堆糖果的异或和为0时,先手必败. 这样问题转化为从N个数中选1一些数使得他们的异或和为0的方案数. 30%,O(2^N) DFS. 假如只有询问, 那么可以直接用类似01背包的dp解决. for i = 1 ~ 1024 dp(i, x) += dp(i-1, x^w_i); dp(i, x