题解:主要是对于炸弹时间的处理,直接让时间赋值给数组,进行判断即可,跑一遍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; }
题解:一个二分题,但是数据非常大,然后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; }
标签:return,int,long,zha,vis,暑假,题记,include From: https://www.cnblogs.com/whatdo/p/17573012.html