暑假补题记2

 题解:主要是对于炸弹时间的处理,直接让时间赋值给数组,进行判断即可,跑一遍bfs的板子就可以了。

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
//#define int long long
using namespace std;
const int N=1000;

int zha[N][N];
int vis[N][N];

struct ac{
    int x,y,t;
};

int biao[5][2]={{0,1},{0,-1},{1,0},{-1,0}};

queue<ac> q;

int bfs()
{
    q.push({0,0,0});
    vis[0][0]=1;
    while (!q.empty())
    {
        ac nod;
        nod=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            int xx=nod.x+biao[i][0];
            int yy=nod.y+biao[i][1];
            int tt=nod.t+1;
            if( (vis[xx][yy]==1) || (xx<0) || (yy<0) || (zha[xx][yy]<=tt) )
                continue;
                vis[xx][yy]=1;
                if(zha[xx][yy]>1000) return tt;
                q.push({xx,yy,tt});
        }
    }
    return -1;
}
int main()
{
    int m;
    scanf("%d",&m);
    memset(zha,10086, sizeof (zha));
    memset(vis, 0, sizeof(vis));
    for(int i=1; i<=m; i++)
    {
        int x1,y1,t1;
        scanf("%d%d%d",&x1,&y1,&t1);
        zha[x1][y1]=min(t1,zha[x1][y1]);
        for(int j=0;j<4;j++)
        {
            int xx=x1+biao[j][0];
            int yy=y1+biao[j][1];
            if(xx>=0&&yy>=0)
            zha[xx][yy]=min(zha[xx][yy],t1);
        }
    }
    cout<<bfs();
    return 0;
}

Problem - E - Codeforces

 

题解:一个二分题,但是数据非常大,然后r的边界要是根号c才符合 或者1e9也过,注意开__int128给 sum

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define int long long
using namespace std;
const int N=2e5+5;

int a[N];
int n,c;
bool check(int x)
{
    __int128 sum=0;
    for(int i=1;i<=n;i++)
    {
        sum+=((__int128)a[i]+2*x)*((__int128)a[i]+2*x);
    }
    if(sum>=(__int128)c)
    {
        return true;
    }
    else
        return false;
}
int32_t main() {
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int t;
    cin>>t;
    while (t--)
    {

        cin>>n>>c;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        int l,r;
        l=1,r=1e9;
        while (l<r)
        {
            int mid=(l+r)/2;
            if(check(mid)) r=mid;
            else l=mid+1;
        }
        cout<<l<<endl;
    }
    return 0;
}

 

posted @ 2023-07-22 11:02  whatdo+  阅读(4)  评论(0编辑  收藏  举报