AtCoder Beginner Contest 176(ABCDE)D题撒币了,int写成bool

A - Takoyaki

题意:

给你n,x,t。
其中做x个小吃的时间为t。每次制作都要时间t。

思路:

就是向上取整就好。

AC

#include <iostream>
using namespace std;
int main()
{
    int n,x,t;
    cin>>n>>x>>t;
    int num=(n+x-1)/x;
    cout<<num*t<<endl;
    return 0;
}

B - Multiple of 9

题意:

给你一个大数,问是否能被9整除。

思路:

把所有位都加起来,如果能被9整除,能么这个大数就能被9整除。

AC

#include <iostream>
#include <cstring>
using namespace std;
const int maxn=2e5+10;
char s[maxn];
int main()
{
    cin>>(s+1);
    int ans=0,len=strlen(s+1);
    for(int i=1; i<=len; i++)ans+=s[i]-'0';
    if(ans%9==0)cout<<"Yes"<<endl;
    else cout<<"No"<<endl;
    return 0;
}

C - Step

题意:

要求把排列弄成非递减。可以增加(stool)凳子。
问最少添加凳子的高度之和。

思路:

贪心即可。
如果cur<pre,那么就要加一个凳子。每次都这么判断。

AC

#include <iostream>
using namespace std;
typedef long long ll;
int main()
{
    int n;
    cin>>n;
    int pre=0;
    ll ans=0;
    for(int i=1; i<=n; i++){
        int x;
        cin>>x;
        if(x<pre)ans+=pre-x,x=pre;
        pre=x;
    }
    cout<<ans<<endl;
    return 0;
}

D - Wizard in Maze

题意:

有一个迷宫,判断能否走出迷宫。

  1. 可以上下左右走。
  2. 也可以使用魔法。魔法可以在以5x5为中心的square里传送到‘.’ .

思路:

一开始没有头绪。后面想起了一道bfs典型题目。闭圈的染色。

  1. 现在对于每个闭圈(被边界围住,或者被#围住),都染色标记一下。
  2. 那么问题就转换成从起点所在的闭圈,到终点所在的闭圈。
  3. 而每个闭圈之间要有联系,就是能使用一次魔法。(连边。边权为1,代表使用了一次魔法,能使用魔法的大情况总共20种,类比于一般bfs的四方向写即可)
  4. 那么跑一次最短路即可(dij堆优化即可)

反思

赛中一个int写成bool一直wa。qwq
在这里插入图片描述

AC

#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <queue>
#define fzhead EDGE(int _to, int _v, int _next)
#define fzbody to(_to), v(_v), next(_next)
#define For(i,x,y) for (int i=(x);i<=(y);i++)
#define FOR(i,x,y) for (int i=(x);i<=(y);i++)
#define mst(x,a) memset(x,a,sizeof(x))
#define mp make_pair
#define fi first
#define se second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int, int>pa;
typedef pair<ll,ll>PA;
inline int read()
{
    int ans=0;
    char c=getchar();bool neg=false;
    while(c<'0'||c>'9')
    {
        if(c=='-')neg=true;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        ans=ans*10+c-'0';
        c=getchar();
    }
    return (neg)?-ans:ans;
}
void write(int x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9)write(x/10);
    putchar(x%10+'0');
}
const int maxn=4e6+10;
int head[maxn<<1], dis[maxn], vis[maxn];
int cnt,n,m;
struct EDGE
{
    int to,v,next;
    EDGE(){}
    fzhead:fzbody{}
}e[maxn<<1];
void add(int bg, int ed, int v)
{
    e[++cnt]=EDGE(ed, v, head[bg]);
    head[bg]=cnt;
}
inline void dij(int s)
{
    For(i, 1, n)vis[i]=0;
    priority_queue<pa>q;
    dis[s]=0;q.push(mp(0,s));
    while(!q.empty())
    {
        int u=q.top().se;
        q.pop();
        if(vis[u])continue;
        vis[u]=1;
        for(int i=head[u]; i!=-1; i=e[i].next)
        {
            if(dis[e[i].to]>dis[u]+e[i].v)
            {
                dis[e[i].to]=dis[u]+e[i].v;
                q.push(mp(-dis[e[i].to],e[i].to));
            }
        }
    }
}
char g[1010][1010];
int use[1010][1010];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int cx[20]={ 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2,-1,-1,-1,-1,-2,-2,-2,-2,-2};
int cy[20]={ 2,-2, 1, 2,-1,-2, 0, 1, 2,-1,-2, 1, 2,-1,-2, 0, 1, 2,-1,-2};
struct point {
    int x,y;
};
int sx,sy,ex,ey;
bool bfs1(int r, int c, int num){
    queue<point>q;q.push({r,c});
    bool flag=false;
    while(!q.empty()){
        point u=q.front();q.pop();
        r=u.x,c=u.y;
        if(r==ex&&c==ey)flag=1;
        if(use[r][c])continue;
        use[r][c]=num;
        for(int i=0; i<4; i++){
            int tx=r+dx[i];
            int ty=c+dy[i];
            if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&g[tx][ty]=='.'&&!use[tx][ty]){
                q.push({tx,ty});
            }
        }
    }
    if(flag)return true;
    else return false;
}
const int inf=0x3f3f3f3f;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    mst(head,-1);mst(dis,0x3f);
    cin>>n>>m;
    cin>>sx>>sy;
    cin>>ex>>ey;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++)cin>>g[i][j];
    }
    if(bfs1(sx,sy,1)){
        cout<<0<<endl;
        return 0;
    }
    int col=2;
    int st=1,ed;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(!use[i][j]&&g[i][j]=='.'){
                bfs1(i,j,col);
                col++;
            }
        }
    }
    ed=use[ex][ey];
    col--;
    for(int i=1; i<=n; i++){
        for(int j=1; j<=m; j++){
            if(use[i][j]){
                for(int k=0; k<20; k++){
                    int tx=i+cx[k];
                    int ty=j+cy[k];
                    if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&g[tx][ty]=='.'&&use[tx][ty]!=use[i][j]&&use[tx][ty])add(use[i][j],use[tx][ty],1);
                }
            }
        }
    }
    dij(st);
    if(dis[ed]!=inf)cout<<dis[ed]<<endl;
    else cout<<-1<<endl;
    return 0;
}

E - Bomber

题解。(可以说是一道套路题)

传送门

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值