哈尔滨理工大学21级新生程序设计竞赛部分题解

B题:

 如果价格比n张5元总和小的话,5元的张数即为价格除5,1元的张数为余数。

如果价格比n张五元总和小的话,五元的张数几位n,1元的张数为价格减去所有5元的总量。

#include<stdio.h>
int main()
{
	long long n,i,m;
	scanf("%lld %lld",&n,&m);
	if(5*n>m)
	printf("%lld %lld",m/5,m%5);
	else
	printf("%lld %lld",n,m-(5*n));
 } 

C题:

巴什博弈问题,共有n个石子,每次最多取m个,如果n能整除m+1则后手赢,否则先手赢。

#include<stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    if(n%4==0)
     printf("bob");
    else
     printf("kiki");
    return 0;
}

D题:

 找出最小的桃数到最大的桃数中对7求余的最大值即可。

#include<stdio.h>
int main()
{
	long long n,L,R,i,a[1000]={0},k=0,max;
	scanf("%lld %lld %lld",&n,&L,&R);
 a[0]=a[0]+L%n;
	for(i=L+1;i<=R;i++)
	{
		if(i%n==0)
		k++;
		else
		a[k]++;
		}
       max=a[0];
    for(i=1;i<=k;i++)
    {
    	if(a[i]>max)
    	max=a[i];
	}
	printf("%lld",max);
}

E题:

如果是奇数无法拆分,输出-1;如果是偶数找到不大于n的最大2的正整次幂,再使n减去这个数,重新找不大于n的最大2的正整次幂,直到n可以除尽这个正整次幂

#include<iostream>
using namespace std;
int main()
{
	long long n;
	cin>>n;
	long long i=0,a[1000]={0},b=1,k=n,j;
	while(1)
	{
		b=b*2;
		if(k%2==1)
		{
		cout<<"-1"<<endl;
		break;
	    }
		if(b==n)
	    {
	      a[i]=b;
	      i++;
	      break;
		}
		else if(b*2>n)
		{
		a[i]=b;
		i++;
		n=n-b;
		b=1;
	    }
	}
	if(k%2==0)
	for(j=0;j<i;j++)
	{
	printf("%lld ",a[j]);
}
}

F题:

 

 每次比较原字符串的首尾,输出ASCII码较低的一个字符,如果两字符ASCII码相同,则继续比较下一位,每次输出首位置的字符后,首位置向后进一,每次输出尾位置的字符后,尾位置向后进一。最多循环n次,如果首尾位置相同,则为最后一次循环,此次执行后终止循环。

#include<iostream>
#include<string.h>
#include<bits/stdc++.h>
using namespace std;
int main()
{

	int n,i=0,j=-1,k,z,sum1=0,sum2=0,f;
	scanf("%d",&n);
	char a[n],b[n];
	k=n=n-1;
	scanf("%s",&a);
	while(j<k)
	{
	j++;
	if(a[i]>a[n])
	{
	printf("%c",a[n]);
	n--;
    }
	else if(a[i]<a[n])
	{
	printf("%c",a[i]);
	i++;
    }
	else if(a[i]==a[n])
	{
	for(f=0;;f++)	
	{ 
	    if(i==n)
	    {
	    	printf("%c",a[i]);
	    	break;
		}
		if(a[i+f]<a[n-f])
		{
			
			printf("%c",a[i]);
			i++;
			break;
		}
		if(a[i+f]>a[n-f])
		{
			printf("%c",a[n]);
			n--;
			break;
		}
	}
    }
}
}

G题:

 如果三点在同一直线上,且bug坐标位于A,B的坐标中间则需绕开bug,最短路径长度为A,B的X坐标差的绝对值加Y坐标的差的绝对值再加2,否则无需绕开,最短长度为A,B的X坐标差的绝对值加Y坐标的差的绝对值。

#include<stdio.h>
#include<math.h>
int main()
{
	int n,xA,yA,xB,yB,xP,yP,i,temp;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d %d",&xA,&yA);
		scanf("%d %d",&xB,&yB);
		scanf("%d %d",&xP,&yP);
		if(xA<xB)
		{
		temp=xA;
		xA=xB;
		xB=temp;	
		}
		if(yA<yB)
		{
		temp=yA;
		yA=yB;
		yB=temp;	
		}
			
		if(xA==xB&&xB==xP)
		{
           if(yP<yA&&yP>yB)
           {
		   printf("%d\n",(abs(yA-yB)+2));
		   continue;
		   }
		   else
		   {
		   	printf("%d\n",abs(yA-yB));
		   	continue;
		   }
	    }
	    if(yA==yB&&yB==yP)
		{
           if(xP<xA&&xP>xB)
           {
		   printf("%d\n",(abs(xA-xB)+2));
		   continue;
		   }
		   else
		   {
		   	printf("%d\n",abs(xA-xB));
		   	continue;
		   }
	    }
	    if((yA==yB&&yB==yP)!=1&&(xA==xB&&xB==xP)!=1)
	    {
	    	printf("%d\n",abs(yA-yB)+abs(xA-xB));
	    	continue;
		}
}
}

J题:

跳到第i的瓷砖,最大可到达的瓷砖为i+Ai;维护可到达瓷砖的最大值即可,如果最大到达第i的瓷砖且这个瓷砖的Ai小于等于0,则此瓷砖为最大的到达的瓷砖位置。 

#include<stdio.h>
int main()
{
    long long i,n,x,a[1000000],max;
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	max=1+a[1];
	for(i=1;i<=n;i++)
	{
		if((a[i]+i)>=max)
		max=a[i]+i;
		if(i==max&&a[i]<=0)
		break;
	}

	if(max>n)
	max=n;
	printf("%lld",max);
}

H题:

 计算每个小球距离两端点距离的最大值,寻找这些最大值的最大值即为掉下所需的最长时间。

 计算每个小球距离两端点距离的最小值,寻找这些最小值的最大值即为掉下所需的最短时间。

这里定义MAX变量是最短时间,MIN是最长时间。

#include <bits/stdc++.h>
using namespace std;
int l,n,a[1000000],b[1000000],c[1000000],i,MIN,MAX;
int main()
{
	int max(int,int);
	int min(int,int);
	scanf("%d",&l);
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(i=0;i<n;i++)
	{
	 c[i]=max(l-a[i],a[i]);
	}
	MIN=c[0];
	for(i=0;i<n;i++)
	{
		if(c[i]>MIN)
		MIN=c[i];
	}
	for(i=0;i<n;i++)
	{
		b[i]=min(l-a[i],a[i]);
	}
	MAX=b[0];
	for(i=1;i<n;i++)
	if(b[i]>MAX)
	MAX=b[i];
	printf("%d %d",MAX,MIN);
}
int max(int a,int b)
{
	if(a>b)
	return a;
	if(a<b);
	return b;
	if(a==b);
	return a;
}
int min(int a,int b)
{
	if(a>b)
	return b;
	if(a<b);
	return a;
	if(a==b);
	return a;
}

I题:

每次比分的最小值与与上一次比分中的最小值i比较,如果i小于这次比分的最小值就继续比较,同分的次数+1,直到两数相等。如果每次输入的比分已经相同,不要让i赋值这个数,继续保持最大值+1,否则下次比较会多比较一次这个数。

#include<stdio.h>
int main()
{
	long long i=0,j=0,count=0,n,k,I=0,J=0,x,y;
	int max(int,int);
	int min(int,int);
	scanf("%lld",&n);
	for(k=0;k<n;k++)
	{  
	    scanf("%lld %lld",&x,&y);
	    if(k>0)
	    if(x==I&&y==J)
	    continue;
	     while(1)
		{
		    if((i==j)&&i<=x&&j<=y)
		  {
		  	i++;j++; 
		  	count++;
			continue;
		  }
		  else
		  break;
	    }
	    I=x;J=y;
	    if(i<=max(x,y))
	    {
		i=max(x,y);j=max(x,y);
	    }
	}
	printf("%lld",count);
	return 0;
}
int max(int a,int b)
{
	if(a>b)
	return a;
	else if(a<b)
	return b;
	else
	return a;
}
int min(int a,int b)
{
	if(a<b)
	return a;
	else if(a>b)
	return b;
	else
	return a;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值