A-公交线路
解:两个方向都模拟一下,判断。
#include<bits/stdc++.h>
using namespace std;
int n,x,y,m;
int main()
{
scanf("%d %d %d",&n,&x,&y);//站数,上车站,下车站
int a[n];
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);//公交站
}
scanf("%d",&m);
int b[m];
int f1=1,f2=1;
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i]);//上车后听到的播报
int x1=x+i,x2=x-i;
if(b[i]!=a[x1])f1=0;
if(b[i]!=a[x2])f2=0;
}
if(y>x){
if(f1==1&&f2==1)printf("Unsure");
else if(f1==1)printf("Right");
else printf("Wrong");
}else{
if(f1==1&&f2==1)printf("Unsure");
else if(f2==1)printf("Right");
else printf("Wrong");
}
return 0;
}
D-修建道路
解:乍一看以为是最小生成树,仔细一看根本不用,就找相邻俩数最大值累加就行。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
long long a[n];
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
long long ans=0;
for(int i=1;i<n;i++)
{
ans+=max(a[i-1],a[i]);
}
printf("%lld",ans);
return 0;
}
G-3G网络
解:一个歪门邪道的解法,基于题目样例以及我们天马行空的想象力解出来的——既然r趋于无穷大,那岂不是可以近似的看成所有圆都重叠了,所以直接输出1/n即可。题目要求误差不超过1e-9,但我看题目样例都保留15位小数,我也就保留15位了。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d %d",&x,&y);
}
double a=n;
printf("%.15lf",1.0/n);
return 0;
}
I-驾驶卡丁车
解:模拟。细心就好 (我骂我自己) 。
我一开始写的代码比较混乱,这个代码是我后来改过的,看起来清晰一些。
#include<bits/stdc++.h>
using namespace std;
char a[55][55];
int dx[]={-1,-1,0,1,1,1,0,-1};//八个方向
int dy[]={0,1,1,1,0,-1,-1,-1};
struct node{
int x,y;
};
node pos;//记录卡丁车位置(其实不用结构体、直接定义x和y也ok,但我当时脑抽)
int n,m,q,flag=0,v=0;//flag记录方向,v记录速度
string s;
int solve()//用来判断有没有撞墙的函数
{
for(int i=1;i<=v;i++)
{ //对于一次走好几步的必须得一步步看有没有撞墙,什么时候撞墙什么时候结束。
int tx=pos.x+dx[flag];
int ty=pos.y+dy[flag];
if(a[tx][ty]!='#'&&tx>=0&&tx<n&&ty>=0&&ty<m)
{ //前四行是“穿模”,跟撞墙一样
if(flag==1 && a[pos.x-1][pos.y]=='#' && a[pos.x][pos.y+1]=='#') return 0;
else if(flag==3 && a[pos.x+1][pos.y]=='#' && a[pos.x][pos.y+1]=='#') return 0;
else if(flag==5 && a[pos.x+1][pos.y]=='#' && a[pos.x][pos.y-1]=='#') return 0;
else if(flag==7 && a[pos.x-1][pos.y]=='#' && a[pos.x][pos.y-1]=='#') return 0;
else{
pos.x=tx;
pos.y=ty;
//没撞墙就往前走一步
}
}else return 0;
}
return 1;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<m;j++)
{
scanf("%c",&a[i][j]);
if(a[i][j]=='*'){
pos.x=i;//起始位置
pos.y=j;
}
}
}
scanf("%d",&q);//q次命令
getchar();
cin>>s;
for(int i=0;i<q;i++)
{
if(s[i]=='R'||s[i]=='L'){
if(s[i]=='R')flag=(flag+1)%8;//改方向
if(s[i]=='L')flag=(flag+7)%8;
if(v!=0&&solve()==0)
{ //速度不为零还撞墙了
printf("Crash! ");
v=0;
}
printf("%d %d\n",pos.x+1,pos.y+1);
}else if(s[i]=='U'||s[i]=='D'){
if(s[i]=='U')v++;
else v=max(v-1,0);
if(solve()==0){//撞墙
printf("Crash! ");
v=0;
}
printf("%d %d\n",pos.x+1,pos.y+1);
}
}
return 0;
}
K-音乐游戏
解:水题。统计有几个短横。
#include<bits/stdc++.h>
using namespace std;
int n,ans;
char s;
int main(){
scanf("%d",&n);
for(int i=0;i<n;i++)
{
getchar();
for(int j=0;j<6;j++)
{
scanf("%c",&s);
if(s=='-')ans++;
}
}
printf("%d\n",ans);
return 0;
}
总结
写代码不够仔细,码力有待提高。比赛结束之后总觉得自己是可以做的更好的。之后得多练,多写题。