admin 管理员组文章数量: 887021
Codeforces Round #361 (Div. 2) A,B,C
【ps】最近真的状态低迷啊,是该改变一下懒散的性格了。来写一下昨天晚上这场cf的题解吧,只有idiv2的A,B,C。
【A. Mike and Cellphone】
【题目链接】点击打开链接
【解题思路】水题,只需要判断给的字符串映射到键盘矩阵里面上下左右平移之后是否合法即可。
【我的AC代码】
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int dir[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
int n;
char s[10];
bool vis1[10][10],vis2[10][10];
int main()
{cin>>n;cin>>s;memset(vis1,false,sizeof(vis1));memset(vis2,false,sizeof(vis2));int len=strlen(s);for(int i=1; i<=3; i++){for(int j=1; j<=3; j++){vis1[i][j]=true;}}vis1[4][2]=true;for(int i=0; i<len; i++){int dx=(s[i]-'0'+2)/3;int dy=(s[i]-'0')%3;if(dy==0) dy=3;if(s[i]=='0') dx=4,dy=2;vis2[dx][dy]=true;}bool fuck=1;for(int i=0; i<4; i++){bool ok=1;for(int j=1; j<=4; j++){for(int k=1; k<=4; k++){if(!vis2[j][k]) continue;int tx = j+dir[i][0];int ty = k+dir[i][1];if(!vis1[tx][ty]) ok=0;}}if(ok){fuck=0;}}if(fuck){puts("YES");}else{puts("NO");}return 0;
}
【B. Mike and Shortcuts】
【题目链接】点击打开链接
【题意】这题题意真的坑,读了半个小时还是蒙逼状态,看到样例观察规律发现是一个裸的对短路。
【我的AC代码】
#include <bits/stdc++.h>
using namespace std;
#define INF 0x7f7f7f7f
const int maxn=200010;
int n,x;
struct edge{int to,next,len;
}E[maxn*10];
int dis[maxn*10];
int head[maxn*10],tot;
void init()
{memset(head,-1,sizeof(head));tot=0;
}
void addedge(int u,int v,int w)
{E[tot].to=v,E[tot].len=w,E[tot].next=head[u],head[u]=tot++;
}
int vis[maxn];
void dij(int st,int en)
{memset(vis,false,sizeof(vis));memset(dis,INF,sizeof(dis));queue<int> q;vis[st] = true;dis[st] = 0;q.push(st);while(!q.empty()){int xx = q.front();q.pop();vis[xx] = false;for(int i = head[xx];i != -1;i = E[i].next){int ed = E[i].to;if(dis[ed] > dis[xx] + E[i].len){dis[ed] = dis[xx] + E[i].len;if(!vis[ed]){q.push(ed);vis[ed] = true;}}}}
}
int main()
{cin>>n;init();for(int i=1; i<=n-1; i++) addedge(i,i+1,1),addedge(i+1,i,1);for(int i=1; i<=n; i++){cin>>x;addedge(i,x,1);}dij(1,n);for(int i=1; i<=n; i++){cout<<dis[i]<<" ";}cout<<endl;return 0;
}
【C. Mike and Chocolate Thieves】
【题目链接】点击打开链接
【题意】给了你一个数m,问你能否找到一个n,使得n里面包含m个数,这m个数满足m*k,m*k*k,m*k*k*k<=n。
【解题思路】二分即可。
【我的AC代码】
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define ll long long
ll m;
int main()
{cin>>m;ll l=0,r=0x7F7F7F7F7F7F7F7F;while(l<=r){ll mid=(l+r)/2;ll t=0;for(ll k=2; k*k*k<=mid; k++){t+=mid/(k*k*k);}if(t<m) l=mid+1;else r=mid-1;}ll ans=0;for(ll k=2; k*k*k<=l; k++){ans+=l/(k*k*k);}if(ans==m){cout<<l<<endl;}elsecout<<"-1"<<endl;return 0;
}
【你没有时间可以浪费了】
本文标签: Codeforces Round 361 (Div 2) A b c
版权声明:本文标题:Codeforces Round #361 (Div. 2) A,B,C 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1731062409h1433881.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论