题解:
给出P序列,序列中的数字依次表示串S中第i个)的左边有多少个(,由此求出从第i个)到最左,能组成多少个完整的()。
//且被用过的)、(不能再用于组成完整()
模拟思路是,先将一个char数组s[]全部初始化为‘(’,再通过输入的P序列,用数组r[]保存所有右括号在串S中的位置,
r[1]=p[1]+1,r[i]=r[i-1]+p[i]-p[I-1]+1(i!=1时),然后更改s[]: s[r[i]]=')',即可得到串S的内容;
在依次从每个)所在的位置向左搜,若为(,则lp++,若为(,则rp++,每向左搜一个位,都要判断一次是否lp==rp,即是否组成了完整的(),
若相等,则跳出循环//记得lp和rp要先初始化为0。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int t,n,lp,rp,p[25],w[25],r[100];
char s[100];
scanf("%d",&t);
while(t--)
{
memset(w,0,sizeof(w));
memset(r,0,sizeof(r));
memset(s,'(',sizeof(s));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
if(i==1)
r[i]=p[i]+1;
else
r[i]=r[i-1]+p[i]-p[i-1]+1;
}
for(int i=1;i<=n;i++)
s[r[i]]=')';
for(int i=1;i<=n;i++)
{
lp=0,rp=0;
for(int j=r[i];j>0;j--)
{
if(s[j]=='(')
lp++;
else if(s[j]==')')
rp++;
if(lp==rp)
break;
}
if(i!=n)
printf("%d ",rp);
else
printf("%d\n",rp);
}
}
return 0;
}
------------------------------------------------------------------------------------------------------------------
题解:
其实就是很简单的模拟了,模拟过程不难写,主要是有些细节不注意会导致WA;
比如说机器人往前走的时候,要一步步走,而且每走一步都要判断一次是否撞上了另一个机器人,
因为如果直接加总步数结果是越界,而实际上在行走过程有另一个机器人的话,那么输出结果是错误的,应该是与机器人2相撞,而不是撞墙。
//代码太长,应该多写个函数的
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{
int k,flag;
int X,Y;
int n,m;
int x[105],y[105],xy[105][105];
char dir[105];
int num[105],rep[105];
char way[105];
scanf("%d",&k);
while(k--)
{
memset(xy,0,sizeof(xy));
scanf("%d%d",&X,&Y);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
cin>>x[i]>>y[i]>>dir[i];
xy[x[i]][y[i]]=i;
}
flag=1;
for(int i=1;i<=m;i++)
cin>>num[i]>>way[i]>>rep[i];
for(int i=1;i<=m;i++)
{
if(way[i]=='L')
{
if(rep[i]%4==1)
{
if(dir[num[i]]=='N') dir[num[i]]='W';
else if(dir[num[i]]=='W') dir[num[i]]='S';
else if(dir[num[i]]=='S') dir[num[i]]='E';
else if(dir[num[i]]=='E') dir[num[i]]='N';
}
else if(rep[i]%4==2)
{
if(dir[num[i]]=='N') dir[num[i]]='S';
else if(dir[num[i]]=='W') dir[num[i]]='E';
else if(dir[num[i]]=='S') dir[num[i]]='N';
else if(dir[num[i]]=='E') dir[num[i]]='W';
}
else if(rep[i]%4==3)
{
if(dir[num[i]]=='N') dir[num[i]]='E';
else if(dir[num[i]]=='W') dir[num[i]]='N';
else if(dir[num[i]]=='S') dir[num[i]]='W';
else if(dir[num[i]]=='E') dir[num[i]]='S';
}
}
else if(way[i]=='R')
{
if(rep[i]%4==1)
{
if(dir[num[i]]=='N') dir[num[i]]='E';
else if(dir[num[i]]=='W') dir[num[i]]='N';
else if(dir[num[i]]=='S') dir[num[i]]='W';
else if(dir[num[i]]=='E') dir[num[i]]='S';
}
else if(rep[i]%4==2)
{
if(dir[num[i]]=='N') dir[num[i]]='S';
else if(dir[num[i]]=='W') dir[num[i]]='E';
else if(dir[num[i]]=='S') dir[num[i]]='N';
else if(dir[num[i]]=='E') dir[num[i]]='W';
}
else if(rep[i]%4==3)
{
if(dir[num[i]]=='N') dir[num[i]]='W';
else if(dir[num[i]]=='W') dir[num[i]]='S';
else if(dir[num[i]]=='S') dir[num[i]]='E';
else if(dir[num[i]]=='E') dir[num[i]]='N';
}
}
else if(way[i]=='F')
{
if(dir[num[i]]=='N')
{
if(y[num[i]]+rep[i]>Y)
{
for(int j=y[num[i]]+1;j<=Y;j++)
{
if(xy[x[num[i]]][j]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[x[num[i]]][j]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
printf("Robot %d crashes into the wall\n",num[i]);
flag=0;
break;
}
}
else
{
for(int j=y[num[i]]+1;j<=y[num[i]]+rep[i];j++)
{
if(xy[x[num[i]]][j]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[x[num[i]]][j]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
xy[x[num[i]]][y[num[i]]]=0;
y[num[i]]+=rep[i];
xy[x[num[i]]][y[num[i]]]=num[i];
}
}
}
else if(dir[num[i]]=='S')
{
if(y[num[i]]-rep[i]<1)
{
for(int j=y[num[i]]-1;j>=1;j--)
{
if(xy[x[num[i]]][j]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[x[num[i]]][j]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
printf("Robot %d crashes into the wall\n",num[i]);
flag=0;
break;
}
}
else
{
for(int j=y[num[i]]-1;j>=y[num[i]]-rep[i];j--)
{
if(xy[x[num[i]]][j]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[x[num[i]]][j]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
xy[x[num[i]]][y[num[i]]]=0;
y[num[i]]-=rep[i];
xy[x[num[i]]][y[num[i]]]=num[i];
}
}
}
else if(dir[num[i]]=='E')
{
if(x[num[i]]+rep[i]>X)
{
for(int j=x[num[i]]+1;j<=X;j++)
{
if(xy[j][y[num[i]]]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[j][y[num[i]]]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
printf("Robot %d crashes into the wall\n",num[i]);
flag=0;
break;
}
}
else
{
for(int j=x[num[i]]+1;j<=x[num[i]]+rep[i];j++)
{
if(xy[j][y[num[i]]]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[j][y[num[i]]]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
xy[x[num[i]]][y[num[i]]]=0;
x[num[i]]+=rep[i];
xy[x[num[i]]][y[num[i]]]=num[i];
}
}
}
else if(dir[num[i]]=='W')
{
if(x[num[i]]-rep[i]<1)
{
for(int j=x[num[i]]-1;j>=1;j--)
{
if(xy[j][y[num[i]]]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[j][y[num[i]]]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
printf("Robot %d crashes into the wall\n",num[i]);
flag=0;
break;
}
}
else
{
for(int j=x[num[i]]-1;j>=x[num[i]]-rep[i];j--)
{
if(xy[j][y[num[i]]]!=0)
{
printf("Robot %d crashes into robot %d\n",num[i],xy[j][y[num[i]]]);
flag=0;
break;
}
}
if(!flag)
break;
else
{
xy[x[num[i]]][y[num[i]]]=0;
x[num[i]]-=rep[i];
xy[x[num[i]]][y[num[i]]]=num[i];
}
}
}
}
}
if(flag)
printf("OK\n");
}
return 0;
}
-----------------------------------------------------------------------------------------------------------------
题解:
题目看懂就可以了,没有坑的超级简单模拟题。
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
char chess[40][40];
for(int i=0;i<17;i++)
scanf("%s",&chess[i]);
printf("White: ");
bool flag=false;
for(int i=15;i>=1;i-=2)
{
if(flag) break;
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='K')
{
printf("K");
printf("%c%d",'a'+j/4,8-i/2);
flag=true;
break;
}
}
}
for(int i=15;i>=1;i-=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='Q')
{
printf(",Q");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=15;i>=1;i-=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='R')
{
printf(",R");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=15;i>=1;i-=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='B')
{
printf(",B");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=15;i>=1;i-=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='N')
{
printf(",N");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=15;i>=1;i-=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='P')
{
printf(",");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
printf("\n");
printf("Black: ");
flag=false;
for(int i=1;i<=15;i+=2)
{
if(flag) break;
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='k')
{
printf("K");
printf("%c%d",'a'+j/4,8-i/2);
flag=true;
break;
}
}
}
for(int i=1;i<=15;i+=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='q')
{
printf(",Q");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=1;i<=15;i+=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='r')
{
printf(",R");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=1;i<=15;i+=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='b')
{
printf(",B");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=1;i<=15;i+=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='n')
{
printf(",N");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
for(int i=1;i<=15;i+=2)
{
for(int j=2;j<=30;j+=4)
{
if(chess[i][j]=='p')
{
printf(",");
printf("%c%d",'a'+j/4,8-i/2);
}
}
}
printf("\n");
return 0;
}
----------------------------------------------------------------------------------------------------------------
题解:
就是上一题的逆过程,更加简单。
只是写程序的时候,因为对于这种混合型数据的读取还没掌握,所以遇到了卡顿;
char while[1005],black[1005];
cin.getline(white,1005);
cin.getline(black,1005);
就可以读取一整行的white数组内容,和一整行的black数组内容了。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
using namespace std;
int main()
{
char white[1005],black[1005];
char chess[19][35]={
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'},
{'|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|',':',':',':','|','.','.','.','|'},
{'+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+','-','-','-','+'}};
cin.getline(white,1005);
cin.getline(black,1005);
int lenw=strlen(white),lenb=strlen(black);
for(int i=0;i<lenw;i++)
{
if(white[i]=='K')
chess[17-2*(white[i+2]-'0')][(white[i+1]-'a')*4+2]='K';
else if(white[i]=='Q')
chess[17-2*(white[i+2]-'0')][(white[i+1]-'a')*4+2]='Q';
else if(white[i]=='R')
chess[17-2*(white[i+2]-'0')][(white[i+1]-'a')*4+2]='R';
else if(white[i]=='B')
chess[17-2*(white[i+2]-'0')][(white[i+1]-'a')*4+2]='B';
else if(white[i]=='N')
chess[17-2*(white[i+2]-'0')][(white[i+1]-'a')*4+2]='N';
else if(white[i-1]==','&&
(white[i]=='a'||white[i]=='b'||white[i]=='c'||white[i]=='d'
||white[i]=='e'||white[i]=='f'||white[i]=='g'||white[i]=='h'))
chess[17-2*(white[i+1]-'0')][(white[i]-'a')*4+2]='P';
}
for(int i=0;i<lenb;i++)
{
if(black[i]=='K')
chess[17-2*(black[i+2]-'0')][(black[i+1]-'a')*4+2]='k';
else if(black[i]=='Q')
chess[17-2*(black[i+2]-'0')][(black[i+1]-'a')*4+2]='q';
else if(black[i]=='R')
chess[17-2*(black[i+2]-'0')][(black[i+1]-'a')*4+2]='r';
else if(black[i]=='B')
chess[17-2*(black[i+2]-'0')][(black[i+1]-'a')*4+2]='b';
else if(black[i]=='N')
chess[17-2*(black[i+2]-'0')][(black[i+1]-'a')*4+2]='n';
else if(black[i-1]==','&&
(black[i]=='a'||black[i]=='b'||black[i]=='c'||black[i]=='d'
||black[i]=='e'||black[i]=='f'||black[i]=='g'||black[i]=='h'))
chess[17-2*(black[i+1]-'0')][(black[i]-'a')*4+2]='p';
}
for(int i=0;i<17;i++)
{
for(int j=0;j<33;j++)
cout<<chess[i][j];
cout<<endl;
}
return 0;
}
-----------------------------------------------------------------------------------------------------------------
题解:
需要知道一个数学定理: 平行向量定理:x1*y2-x2*y1=0
用一个二维数组k[][]保存每个士兵坐标与枪支坐标的差值,k[i][0]记录xi-x枪,k[i][1]记录yi-y枪;然后计算与前面的k[j][](j<i)是否为平行向量,若不是则sum++。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
//运用平行向量定理:x1*y2-x2*y1=0
int main()
{
int n,x0,y0,flag,x,y,sum=0;
int k[1005][2];
scanf("%d%d%d",&n,&x0,&y0);
for(int i=0;i<n;i++)
{
flag=1;
scanf("%d%d",&x,&y);
k[i][0]=x-x0,k[i][1]=y-y0;
for(int j=0;j<i;j++)
{
if(k[i][0]*k[j][1]==k[i][1]*k[j][0])
{
flag=0;
break;
}
}
if(flag)
sum++;
}
printf("%d\n",sum);
return 0;
}
-----------------------------------------------------------------------------------------------------------------
题解:
题目意思是 找出一个最大的不含数字0和数字1的数,该数各位上的数的阶乘的乘积 须等于 输入的数各位上数的阶乘的乘积; 因为要最大,且都是乘法,所以尽量得到每个数阶乘的最多因子数;
这题暴力,0!,1!→1
2!→2
3!→3,2
4!→(2,2),3,2
5!→5,(2,2),3,2
6!→(3,2),5,(2,2),3,2
7!→7,(3,2),5,(2,2),3,2
8!→(2,2,2),7,(3,2),5,(2,2),3,2
9!→(3,3),(2,2,2),7,(3,2),5,(2,2),3,2
把以上对应的数保存在数组x[]中,排序,然后按升序输出即可。
#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int n,t=0,a[20],x[100];
string s,s1="0123456789";
scanf("%d",&n);
cin>>s;
for(int i=0;i<n;i++)
{
for(int j=0;j<10;j++)
if(s[i]==s1[j])
a[i]=j;
}
for(int i=0;i<n;i++)
{
if(a[i]==2||a[i]==3||a[i]==5||a[i]==7)
{
x[t]=a[i];
t++;
}
else if(a[i]==4)
{
x[t]=3,x[t+1]=x[t+2]=2;
t+=3;
}
else if(a[i]==6)
{
x[t]=5,x[t+1]=3;
t+=2;
}
else if(a[i]==8)
{
x[t]=7,x[t+1]=x[t+2]=x[t+3]=2;
t+=4;
}
else if(a[i]==9)
{
x[t]=7,x[t+1]=x[t+2]=3,x[t+3]=2;
t+=4;
}
}
sort(x,x+t);
for(int i=t-1;i>=0;i--)
printf("%d",x[i]);
printf("\n");
return 0;
}
---------------------------------------------------------------------------------------------------------------
题解:
手机里有n个app,要打开m个app,屏幕每页最多能容纳k个app,且打开一个app,该app会往前移动一个位置(如果是第一个位置就不变);
需要求出打开完m个app所需的总手势数,其中,滑动一页、点击app都算是一次手势数,且每点开一个app之后,都会回到第一页。
//这题数据很大,用long long
#include<iostream>
#include<cstdio>
using namespace std;
//b[]记录应用t所在的位置,模拟时交换a[],同时也要改变b[]
int main()
{
int n,m,k,app,sit;
long long res=0;
int a[100005],b[100005];
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]=i;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&app);
res+=(b[app]-1)/k+1; //重点AC:<strong>b[app]要-1,因为如果需要打开的app是该页的最后一个,那若不-1,得出的结果会多1</strong>
sit=b[app];
if(sit>1)
{
swap(a[sit],a[sit-1]);
b[a[sit]]=sit;
b[a[sit-1]]=sit-1;
}
}
printf("%I64d\n",res);
return 0;
}
----------------------------------------------------------------------------------------------------------------
题解:
一个老司机带两个菜鸟,或者两个老司机带一个菜鸟,然后现在有n个老司机和m个菜鸟,问最多能分成多少组?
不管哪种组合都是3人一组。。所以最大组数就是(n+m)/3与n与m中的最小值.。。。
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int n,m,res;
scanf("%d%d",&n,&m);
res=(m+n)/3;
res=min(res,min(n,m));
printf("%d\n",res);
return 0;
}