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
题意:
有一个迷宫,判断能否走出迷宫。
- 可以上下左右走。
- 也可以使用魔法。魔法可以在以5x5为中心的square里传送到
‘.’
.
思路:
一开始没有头绪。后面想起了一道bfs典型题目。闭圈的染色。
- 现在对于每个闭圈(被边界围住,或者被
#
围住),都染色标记一下。 - 那么问题就转换成从起点所在的闭圈,到终点所在的闭圈。
- 而每个闭圈之间要有联系,就是能使用一次魔法。(连边。边权为1,代表使用了一次魔法,能使用魔法的大情况总共20种,类比于一般bfs的四方向写即可)
- 那么跑一次最短路即可(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;
}