A-回文括号序列计数
链接:https://ac.nowcoder.com/acm/contest/9986/A
来源:牛客网
题目描述
我们定义一个字符串S是回文的,表示S的左右反转和S相同。
我们定义一个字符串是括号序列:
- 空串是括号序列。
- 两个括号序列P和Q的拼接是括号序列。
- 如果P是括号序列,’(’+P+’)'是括号序列。
求长度为 n (0<=n<=10^9) 的回文括号序列的方案数,对 998244353 取膜。
输入描述:
第一行一个 T 表示数据组数。T<=1000000。
接下来 T 行,每行一个 n 。
输出描述:
T 行。对于每组数据,你的答案。
解题思路:这个括号序列只能是空串的情况下才是回文
考虑一个长度 >=1 的括号序列,如果满足第一个字符和最后一个字符相等:
如果都是左括号则第一个括号无法匹配。
如果都是右括号则最后一个括号无法匹配。
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
int t;
cin>>t;
while(t--){
cin>>n;
if(n==0)cout<<1<<endl;
else cout<<0<<endl;
}
return 0;
}
D-划数
链接:https://ac.nowcoder.com/acm/contest/9986/D
来源:牛客网
题目描述
一个智能机器人在黑板上写了n个数,它每次划去任意两个数,并在数列的后面写上这两个数的和对11取模的值。
例:5 6 7 8 9,划去5 6后,数列变为7 8 9 0.
有趣的是,机器人在还剩下两个数的时候突然“罢工”了,已知其中一个数cnt(cnt >= 11),求另外一个数的值。
输入描述:
多组测试数据,以 EOF 结尾。
每组数据,第一行输入n和cnt。
第二行输入n个数,第i个数表示num[i]。
输出描述:
每组数据,输出另外一个数的值。
解题思路:模拟
#include<cstdio>
#include<bits/stdc++.h>
#define N 2
int a[1000005];
int main(){
int n,cnt;
long long sum = 0;
while(scanf("%d%d",&n,&cnt)!=EOF){
for(int i=0; i<n; ++i){
scanf("%d",&a[i]);
}
if(n==2){ //考虑特殊情况
if(a[0]==cnt)
printf("%d\n",a[1]);
else printf("%d\n",a[0]);
}
else{
sum = 0;
for(int i=0; i<n; ++i){
if(a[i]!=cnt){
sum = (sum+a[i])%11;
}
}
printf("%d\n",sum);
}
}
return 0;
}
C-末三位
链接:https://ac.nowcoder.com/acm/contest/9986/C
来源:牛客网
题目描述
牛牛最近刚学完指数,他理解了22=4,33=272
2
=4,3
3
=27…
但是,他现在想知道:5^n的末三位是多少?
输入描述:
有多组输入数据。
每组数据输入一个数n,表示指数。
输出描述:
输出5^n的末三位。
解题思路:快速幂
#include<cstdio>
#include<bits/stdc++.h>
#define N 2
int power(int a,int b,int c)
{
int ans = 1;
while(b){
if(b&1){
ans = ans * a % c;
}
a = a * a % c;
b >>= 1;
}
return ans;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF){
printf("%03d\n",power(5,n,1000));
}
return 0;
}
I-贪吃蛇
链接:https://ac.nowcoder.com/acm/contest/9986/I
来源:牛客网
题目描述
无限增长的贪吃蛇小游戏:
在一个n*m的迷宫中,有一条小蛇,地图中有很多围墙,猥琐的出题者用“#”表示,而可以走的路用“.”表示,小蛇他随机出生在一个点上,出生点表示为“S”,他想抵达的终点表示为“E”,小蛇有一个奇怪的能力,他每走一格便会增长一格,即他走了一格后,他的尾巴不会缩回。
小蛇想知道他怎么到达他想去的地方,请你帮助他。
PS:每格长1米,贪吃蛇规定不能撞墙,不能咬自己的身体。
输入描述:
第一行:输入N,M;
第二行:输入S的坐标Xs,Ys,E的坐标Xe,Ye;
后面的N行:
每行输入M个数,描述每一行的情况。
输出描述:
输出一个数,小蛇到达终点的最短距离(单位:cm),若无法达到,输出-1
解题思路:bfs搜索路径,一有路径就停下来这就是最短路径
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y,s;
};
int book[105][105]={0};
int main(){
int nextt[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
struct node que[10005];
char a[105][105];
int n,m,startx,starty,endx,endy;
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&startx,&starty,&endx,&endy);
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
scanf(" %c",&a[i][j]);
}
}
int tail,head;
head = tail = 0;
que[tail].x = startx;
que[tail].y = starty;
que[tail].s = 0;
tail++;
book[startx][starty] = 1;
int flag = 0;
while(head<tail){
int tx,ty;
for(int i=0; i<4; ++i){
tx = que[head].x + nextt[i][0];
ty = que[head].y + nextt[i][1];
if(tx<1||tx>n||ty<1||ty>m){
continue;
}
if(a[tx][ty]=='.' && !book[tx][ty]){
book[tx][ty] = 1;
que[tail].x = tx;
que[tail].y = ty;
que[tail].s = que[head].s+1;
//cout<<tx<<' '<<ty<<' '<<que[tail].s<<endl;
tail++;
}
if(tx==endx && ty==endy){
flag = 1;
break;
}
}
if(flag==1)
break;
head++;
}
if(flag==0){
printf("-1\n");
}
else
printf("%d\n",que[tail-1].s*100);
return 0;
}
本文精选了算法竞赛中的四个典型问题及其解决方案,包括回文括号序列计数、划数游戏、计算5的幂次末三位及贪吃蛇游戏最短路径。通过这些题目展示了如何运用快速幂、模拟算法、数据结构和搜索算法解决实际问题。
1147

被折叠的 条评论
为什么被折叠?



