2021CCPC女生专场


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;
}

总结

写代码不够仔细,码力有待提高。比赛结束之后总觉得自己是可以做的更好的。之后得多练,多写题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值